繁体   English   中英

如何使用ZeroMQ唤醒线程

[英]How to wake up threads with ZeroMQ

我当前的程序正在通过zmq接收消息。 线程不时唤醒,并检查上次收到的zmq。

现在,我想改进此设置,并实际处理收到的每条消息,而不仅仅是唤醒时的最后一条消息。 另外,当有新内容出现时,我也想唤醒我的线程。 一旦zmq对我的线程有新消息,是否有办法让zmq强制我的线程唤醒。

ZMQ全部涉及Actor模型编程。 它是一个反应堆。 您可以使用zmq_poll()等待一组套接字中的一个准备就绪以进行读取。 当您这样做时,您会从中阅读。

因此,您的程序成为一个循环,在顶部调用zmq_poll()进行阻塞(或超时),然后再处理已准备好读取的任何套接字,然后循环。

相反,回叫属于Proactor模型编程。 您说应该先发生(通过设置回叫),然后不管发生什么。

要记住的重要一点是,Reactor和Proactor确实不会混合使用。 如果可以帮助,请不要将两者融合在一起,这将是无休止的混乱之源。 要么全力以赴。 这就是ZeroMQ没有回调机制的原因。

两种样式的不良混合是ZeroMQ的IPC传输在Windows上不起作用的原因。 ZeroMQ的反应堆是zmq_poll() 从根本上讲,这取决于提供反应器的OS。 在Linux上,这是select()epoll() ,这对于* nix是标准的,可以与任何文件描述符一起使用(网络套接字,IPC管道,串行端口等)。

相反,Windows不提供通用反应器。 它获得的最接近的是select() ,它仅在网络套接字上有效。 要在Windows中阻塞管道,请使用带有回叫功能的呼叫。 从根本上说,Windows是一个proactor系统,关于它,有很多事情要做。 这就是为什么Boost.Asio东西也是proactor的原因-它可以在Windows上运行。

在反应器系统顶部合成前驱体是相对简单的。 您的反应堆循环仅成为事件调度程序。

相反,在Windows上进行高效反应器的尝试必须诉诸于轮询线程。 cygwin就是这样做的。 他们在POSIX select()实现中为每个文件描述符运行一个线程(这只是Windows HANDLE的抽象),每个忙于轮询其句柄以等待是否可以读取数据。 没有效率。

现在,真正非常有趣的事情是,Microsoft已经离开并完成了Windows 10的Linux运行时。这是系统调用级别的实现(与cygwin完全不同)。 这确实支持epoll()select()所需的系统调用,并且确实适用于管道,套接字等。我真正想要知道的是它们如何实现的? 请在明信片上回答...

正如您提到的“ 还有一些新的东西我也希望我的线程醒来。 ”, 如果将回调分配给data receive则可以实现这一点 ,因此每当新数据到达时,都会执行该回调。

但是在阅读了有关zeromq并引用以下链接之后:

是否可以向ZeroMQ添加事件处理以在接收/发送数据时采取行动?

在数据到达时,ZeroMQ是否具有通知/回调事件/消息?

到目前为止,ZeroMQ尚未实现任何回调,这些回调将在收到新数据时通知我们 您绝对可以通过在阻塞模式下使用zmq_recv来检查新数据(但这并不意味着在收到新数据时就醒来,它只会一直阻塞直到数据到来为止)。

如以上链接所述,一种可能的解决方案:

您可以将SIGNALS和zmq一起使用,这将在到达新数据时通知。 使用信号处理程序/中断处理程序的优点是,它们不会在新数据到达之前就阻塞代码(例如zmq_recv()处于阻塞模式),而信号处理程序将唤醒,并且仅在接收到特定信号时才执行。

SIGUSR1 / SIGUSR2这样的信号可以用作新数据到达的指示。 当新数据到达时,将信号处理程序分配给SIGUSR1以执行代码。

要在有新数据时唤醒进程,则必须发送数据并发送如下信号:

zmq_send(...);

kill(pid, SIGUSR1);         /*  Send signal SIGUSR1 to the process
                                            whose PID is specified
                                                                   */

接收进程接收信号SIGUSR1并唤醒以执行其处理程序。 在此信号的处理程序中,您可以读取数据并执行某些任务。 现在,仅当您与SIGUSR1信号一起发送一些新数据时,该处理程序才会再次执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM