当我的套接字尚未连接到绑定地址时,我一直在试图弄清楚如何关闭Context-instance(或者如果我甚至需要)。这是我的演示代码:
导入zmq导入json
data = {}…
ZeroMQ使用 的 Context 强> - 作为一个自治战场单位的实例。它有自己的资源,并在尽可能多的IO线程中运行,因为必须进行性能调整才能产生。
Context
由于这些资源分配和与运输相关的基础设施是“昂贵的”,所以 的 .term() 强> -instance方法在交付之前需要适当注意,而不是损坏玩具,它们仍然在IN / OUT队列内等待。我是否同时提到了基础架构设置和维护加上消息传递机制是异步的,不会发生,根据请求可以完成更少的工作吗?不,他们在“分开”下运作 Context() -instance hood,以尽力而为的方式,拥有一个 的 禅宗的零 强> (包括零 - “保修”)设计中的DNA-DNA ...
.term()
Context()
你的代码已经把信息放在“那里”,所以有一个金蛋,那个 .term() -call尝试不破坏,最后杀死之前 Context -instance。
这种行为确实如此 的 期望的行为 强> 并且可以针对案例进行更改,否则应采取适当的设计保护:
import zmq import json print( "Run against ZeroMQ native-API[{0:}]". format( zmq.pyzmq_version_info() ) ) pass; aLocalCONTEXT = zmq.Context.instance() socket = aLocalCONTEXT.socket( zmq.REQ ); socket.connect( "tcp://localhost:5555" ) print( "<aSocket> has LINGER == [{0:}]". format( socket.getsockopt( zmq.LINGER ) ) socket.send_json( json.dumps( { 'key': 'value' } ) ) # MOV. data into Context() socket.close(); print( "I get here!" ) # N/P to .close() socket # /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ BUT! aLocalCONTEXT.term() # THE HELL OPENS HERE, # # GIVEN LINGER WAS -1 # # AS .term()-method # # MUST WAIT UNTIL ALL MSGs # # KNOWN TO BE IN-FLIGHT # # GET INDEED DELIVERED, OUCH
尽管较新的原生ZeroMQ API版本(4.2+)有望设置 zmq.LINGER 除最初注入之外的默认值 的 -1 强> == WAIT INDETERMINANTLY TILL DELIVERED, IF NOT FOREVER IN CASE NO PEERS ARE OUT THERE
zmq.LINGER
-1
== WAIT INDETERMINANTLY TILL DELIVERED, IF NOT FOREVER IN CASE NO PEERS ARE OUT THERE
因此,适当的设计方面的关怀确实是公平的工程实践的标志:o)