簡體   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