【问题标题】:Broadcast-style IPC广播式IPC
【发布时间】:2011-04-01 02:44:39
【问题描述】:

考虑到让进程或线程相互交互的所有选项(锁、互斥体、信号量、消息队列、共享内存等),我有点不知道什么是我想做的最好的事情。

我想要几个进程等待某个事件发生。也就是说,我希望他们阻止直到

  1. 达到一定的超时时间,或者
  2. 某个事件由另一个进程触发。

在任何时候,可以有任意数量的此类等待进程,当唤醒事件发生时,它们都必须唤醒,而不仅仅是一个。

可能使这变得更加困难的一个限制是:它必须是 PHP,并且它还必须通过在 apache 中运行的 mod_php 工作。

【问题讨论】:

    标签: php ipc broadcast wakeup


    【解决方案1】:

    嗯,这有点“hacky”,但你可以用套接字来做到这一点。这真的取决于你想要做什么......我真的想知道你是否真的需要这种系统(而不是试图将流程简化到根本不需要 IPC)......

    创建一个“监听器”守护进程,它只接受套接字连接并将它们放入队列中。它将运行socket_select 等待新连接或要写入套接字的数据。如果数据已写入,它将将该数据写入其所有活动连接,然后关闭它们并重新开始。如果接收到新连接,它会将其放入队列中,然后返回选择...

    那么在你的“孩子”中,你需要做的就是连接到主服务器,设置阻塞socket_set_block($sock),然后设置你的超时:

    socket_set_option(
        $sock,
        SOL_SOCKET,  // socket level
        SO_SNDTIMEO, // timeout option
        array(
            "sec"=>10, // Timeout in seconds
            "usec"=>0  // I assume timeout in microseconds
        )
    );
    

    然后,只需从套接字 (socket_read($sock)) 读取。它会阻塞到您设置的超时时间或直到“master”写回它。通过该调用后,只需关闭套接字并继续做你想做的事......

    【讨论】:

    • 这听起来非常有趣......让我检查一下。
    • 再次,我想强调,如果我是你,我会尝试重新建模应用程序,如果可能的话,首先不需要任何 IPC。这可能适用于您提出的问题(并且没有使用其他形式的 IPC(例如信号量)的无限阻塞问题),但我会尝试在实施 IPC 系统之前先找到一个正常的解决方案这样。 ..
    • 是的,很抱歉没有提供更多细节。这将是一个 Web 应用程序,其中长的 AJAX 查询将首先挂起并等待,然后在精确的时刻返回。并且该返回必须与查看该网页的所有用户同步。可能还会添加应用程序的控制台版本。
    • 好的,我实现了,效果很好!它是一个简单的 echo-daemon,它接受 UNIX 域套接字上的连接;每当它在任何连接上接收到数据时,它都会将其广播到所有其他连接。因此,所有侦听器都可以连接并等待数据(超时),事件触发器可以连接并发送一些数据,然后再次关闭。非常感谢!
    • 没问题!很高兴它可以提供帮助。并且考虑到您没有使用 TCP,它应该是相当有效的......请注意,如果您获得高请求率(特别是如果使用 mod_php),让网络连接阻塞可能会削弱您的服务器......
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2012-06-05
    • 2023-01-07
    • 2014-12-20
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多