Tcp PyZMQ-如果未建立连接,如何终止上下文?

Tcp PyZMQ-如果未建立连接,如何终止上下文?,tcp,zeromq,pyzmq,Tcp,Zeromq,Pyzmq,我一直在想,当我的套接字还没有连接到绑定地址时,如何关闭上下文-实例(或者如果我需要的话)。这是我的演示代码: import zmq import json data = {} data['key'] = 'value' json_data = json.dumps(data) context = zmq.Context.instance() socket = context.socket(zmq.REQ) socket.connect("tcp://localhost:5555") so

我一直在想,当我的套接字还没有连接到绑定地址时,如何关闭
上下文
-实例(或者如果我需要的话)。这是我的演示代码:

import zmq
import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

context = zmq.Context.instance()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

socket.send_json(data)
socket.close()

print("I get here!")

context.term()
我的预期行为是这样结束的。我的实际行为是
context.term()
阻塞,无法^C out。顺便说一句,它会在停止前打印出“我来了!”

结合所选答案的解决方案进行编辑,这样做有效:

import zmq
import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

context = zmq.Context.instance()
socket = context.socket(zmq.REQ)
socket.setsockopt(zmq.LINGER, 100)
socket.connect("tcp://localhost:5555")

socket.send_json(data)
socket.close()

print("I get here!")

context.term()
是的,这是理想的行为。为什么? ZeroMQ使用
上下文
-实例作为自主战场单元。它有自己的资源,在尽可能多的IO线程中运行,这是性能调整所必需的

由于这些资源分配和与传输相关的基础设施“昂贵”,因此
.term()
-实例方法会采取适当的措施,不会损坏在交付前仍在IN/OUT队列中等待的玩具。我是否提到了基础设施的设置和维护以及消息传递机制都是异步的,并且不会发生,在请求时被授权完成的越少?不,它们在
Context()
-实例引擎盖下“单独”运行,以最大努力的方式,在设计DNA中有一个零的Zen(包括零“保修”)

您的代码已经将一条消息放在了“那里”,因此有一个金蛋,
.term()
-调用在最后杀死
上下文
-实例之前尝试不破坏它

这种行为确实是所需的行为,如果在其他情况下采取了适当的设计措施,则可以对其进行更改:

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
导入zmq
导入json
打印(“针对ZeroMQ本机API[{0:}]”。格式(zmq.pyzmq_version_info())
通过;aLocalCONTEXT=zmq.Context.instance()
socket=aLocalCONTEXT.socket(zmq.REQ);插座。连接(“tcp://localhost:5555" )
打印(“has LINGER==[{0:}]”。格式(socket.getsockopt(zmq.LINGER))
send_json(json.dumps({'key':'value'}))#MOV.data到Context()中
socket.close();打印(“我到了!”)#N/P到.close()socket
#/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/但是!
aLocalCONTEXT.term()#地狱在这里开启,
##给定林格为-1
##AS.term()-方法
##必须等到所有MSG
##已知在飞行中
##真的被送到了,哎哟
即使较新的本机ZeroMQ API版本(4.2+)承诺已设置除最初注入的
-1
==之外的
zmq.LINGER
默认值,如果没有对等方,则不确定地等待交付


因此,适当的设计方面的谨慎确实是公平工程实践的标志:o)

谢谢!玲儿正是我所需要的!