Python: ZeroMQ 是否可以设置一个在收到消息后调用的回调?

Python: Can ZeroMQ have setup a callback to be called once it received a message?

我是 ZeroMQ 的新手。我想知道是否有一种方法可以设置回调,一旦消息到来,我的意思是一旦数据存在于流中。

我不想使用线程和循环来指示数据输入,然后调用回调。

你知道如何解决这个问题吗?

好吧,从 v2.x 到最近的 v4.2+,ZeroMQ 本机 API 从未使用过与低级内部相关的回调。所有 API 服务的设计都是为了响应 .poll( 0 ).recv( zmq.NOBLOCK ) 方法,并让用户应用程序做出相应决定并采取相应行动。

如果确实需要使用硬连线回调,有两个可能的前进方向:

1 ) 使用通用的 python 工具 - Tkinter.mainloop() 工厂,在这里可以设置一个带有 StringVar() 实例的阻塞处理程序,由 .recv() 像这样设置(这里是一种阻塞方式):aStringVAR.set( aSocket.recv() ),其中一个还关联了一个 Tracer,它调用所需的回调处理程序以响应 StringVar 存储的新值。

>>> #-----------------------------------------------FAST MOCK-UP EXAMPLE
>>> import Tkinter as tk                          # python27
>>> root = tk.Tk()
>>> root.protocol( "WM_DELETE_WINDOW", root.quit() )
'3071841620Ldestroy'
>>> #------VAR-------------------------------------IMPORTANT TOOL:
>>> aStringVAR = tk.StringVar()
>>> aStringVAR.set( "_init_" )

>>> def aKeyPressEventHANDLER( anEvent ): # SIMPLE EventHANDLER,
        #                                 #        also ignites remote responsive processes
...     aTemplate = "[KEY]::{3: >10s}\n<s/n>::{0: >10d}\n(=@=)::{1: > 10d}\n^from::({5:})"
...     sString   = aTemplate.format( anEvent.serial,
...                                   anEvent.time,
...                                   anEvent.char,
...                                   anEvent.keysym,
...                                   anEvent.keysym_num,
...                               str(anEvent.widget )
...                               )
...     aStringVAR.set( sString ) # <----------------- emulated instead of  aSocket.recv()
...     print sString
... 
>>> #----VAR_TRACER----------------------------------------[#1]
>>> def aVAR_TRACER_A( p1_quasiNAME, p2_indexOrEmptyString, p3_accessMODE ):
...     print "aVAR_TRACER_A()-called::(on){0:} traced_event({1:})".format( str( p1_quasiNAME ), str( p3_accessMODE ) )
...     # ###############=[A]#######
...     # < do some task =[A] here >
...     # ###############=[A]#######
...     print "aVAR_TRACER_A()         [{0:}]".format(   str( root.globalgetvar( p1_quasiNAME ) ).replace( " ", "" ) )
...
>>> #-----VAR_A_tracer_ID------------------------------"w" EVENT SNIFFER WAITING FOR ASSIGNMENT INTO aStringVAR
>>> aTraceVAR_A_tracer_ID = aStringVAR.trace_variable( "w", aVAR_TRACER_A )

aVAR_TRACER_A()-called::(on)PY_VAR0 traced_event(w)
aVAR_TRACER_A()         [[KEY]::a<s/n>::832(=@=)::88486992^from::(.)]
[KEY]::         a
<s/n>::       832
(=@=)::  88486992
^from::(.)
aVAR_TRACER_A()-called::(on)PY_VAR0 traced_event(w)
aVAR_TRACER_A()         [[KEY]::KP_6<s/n>::832(=@=)::88509107^from::(.)]
[KEY]::      KP_6
<s/n>::       832
(=@=)::  88509107
^from::(.)
aVAR_TRACER_A()-called::(on)PY_VAR0 traced_event(w)
aVAR_TRACER_A()         [[KEY]::KP_Multiply<s/n>::832(=@=)::88541180^from::(.)]
[KEY]::KP_Multiply
<s/n>::       832
(=@=)::  88541180
^from::(.)

或更复杂,如果使用直接注入 Tkinter 虚拟事件:

################################################ SETUP EVENT-ROUTING Injector

self.aSigFromZMQ = "<<aVirtualEventSignalledFromZMQ_LAYER>>"

self.bind( self.aSigFromZMQ, anEventHANDLER )
#   |
#   .bind <<virtual_EventNAME>> altogether with <anEventHANDLER>-call


################################################ Context-fully TRIGGER Injector

self.event_generate( self.aSigFromZMQ, aSigContextDICT )
#   |
#   .event_generate( <eventNameId>, **args )  #   triggers <eventNameId>
#                                             # + passes **args, that allows
#                                             #          to set <keyword>=<value> pairs for Event-fields,
#                                             #          that are passed to anEventHANDLER via <Event>-object .

2 ) 更改 ZeroMQ 并使用 ,resp。 NNG 新 API,其中回调机制可以与 socket-state/events.

相关联