我是ZeroMQ的新学习者。我想知道是否有一种设置回调的方法,一旦消息到来就可以调用,我的意思是一旦数据存在于流中。
我不想使用线程……
好吧,从v2.x到最近的v4.2 +之前的ZeroMQ本机API从未使用过与低级内部相关的回调。所有API服务的设计都是为了响应 .poll( 0 ) 要么 .recv( zmq.NOBLOCK ) 方法,让用户应用程序决定并采取相应的行动。
.poll( 0 )
.recv( zmq.NOBLOCK )
如果确实需要使用硬连线回调,则有两种可能的前进方向:
的 1) 强> 使用常见的python工具 - 的 Tkinter.mainloop() 强> 工厂,可以使用a设置阻塞处理程序 的 StringVar() 强> 例如,被设定 .recv() 像这样(这里是宽容的阻挡方式): 的 aStringVAR.set( aSocket.recv() ) 强> 一个人也关联了一个Tracer,它调用所需的回调处理程序以响应StringVar获取存储的新值。
Tkinter.mainloop()
StringVar()
.recv()
aStringVAR.set( aSocket.recv() )
>>> #-----------------------------------------------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 虚拟事件:
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并使用 nanomsg ,resp。 NNG新API,其中回调机制可以与套接字状态/事件相关联。