Python 2.7 Python:ZeroMQ是否可以设置一个回调,以便在收到消息后调用?
我是ZeroMQ的新学员。我想知道是否有一种方法可以设置一个回调,它可以在消息到来时调用,我的意思是一旦数据存在于流中 我不想使用线程和循环来指示中的数据,然后调用回调Python 2.7 Python:ZeroMQ是否可以设置一个回调,以便在收到消息后调用?,python-2.7,zeromq,nanomsg,Python 2.7,Zeromq,Nanomsg,我是ZeroMQ的新学员。我想知道是否有一种方法可以设置一个回调,它可以在消息到来时调用,我的意思是一旦数据存在于流中 我不想使用线程和循环来指示中的数据,然后调用回调 您知道如何解决这个问题吗?好吧,从v2.x到最近的v4.2+版本,ZeroMQ本机API从未使用过与低级内部性相关联的回调。所有API服务的设计都是为了响应.poll(0)或.recv(zmq.NOBLOCK)方法,并让用户应用程序做出相应的决定和行动 如果确实需要使用硬连线回调,则有两种可能的转发方向: 1)使用常见的pyth
您知道如何解决这个问题吗?好吧,从v2.x到最近的v4.2+版本,ZeroMQ本机API从未使用过与低级内部性相关联的回调。所有API服务的设计都是为了响应
.poll(0)
或.recv(zmq.NOBLOCK)
方法,并让用户应用程序做出相应的决定和行动
如果确实需要使用硬连线回调,则有两种可能的转发方向:
1)使用常见的python工具--Tkinter.mainloop()
工厂,在工厂中可以使用StringVar()
实例设置阻塞处理程序,该实例由.recv()
设置,如下所示(这里是一种宽容的阻塞方式):aStringVAR.set(aSocket.recv())
,其中还关联了一个跟踪器,该跟踪器调用所需的回调处理程序,以响应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::(.)
2)更改ZeroMQ并分别使用。NNG新的API,在这里回调机制可以与套接字状态/事件关联。谢谢。这对我很有帮助
################################################ 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 .