PyZMQ - 如果没有建立连接如何终止上下文?
PyZMQ - How to terminate a Context if no connection was made?
我一直在想办法在我的套接字尚未连接到绑定地址时关闭 Context
实例(或者如果我需要的话)。这是我的演示代码:
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 出来。它在停止之前打印出 "I get here!",顺便说一句。
编辑结合所选答案的解决方案,这有效:
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 使用 Context
-实例作为自主战场单元。它拥有自己的资源,并且在 IO-threads 中运行,因为必须进行性能调整才能产生。
由于这些资源分配和 transport-related 基础设施是 "expensive",.term()
-instance 方法会适当小心,不要损坏玩具,在交付之前仍在 IN/OUT-queues 内等待。我有没有提到 infrastructure-setup 和维护加上 message-delivery 机制是异步的并且不会发生,较少的被授予根据请求完成?不,它们在 Context()
实例引擎盖下以 best-effort 方式运行 "separately",具有 Zen-of-Zero(包括一个design-DNA...
内的零-"warranty" )
您的代码已经放置了一条消息 "there",所以有一个 gold-egg,.term()
调用在最终杀死 [=11= 之前尽量避免损坏]-实例。
这种行为确实是期望的行为,并且可以根据其他情况进行更改:
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-versions ( 4.2+ ) 承诺已设置 zmq.LINGER
默认值而不是最初注入的 -1
== WAIT INDETERMINANTLY TILL DELIVERED, IF NOT FOREVER IN CASE NO PEERS ARE OUT THERE
所以应有的 design-side 关注确实是公平工程实践的标志 :o)
我一直在想办法在我的套接字尚未连接到绑定地址时关闭 Context
实例(或者如果我需要的话)。这是我的演示代码:
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 出来。它在停止之前打印出 "I get here!",顺便说一句。
编辑结合所选答案的解决方案,这有效:
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 使用 Context
-实例作为自主战场单元。它拥有自己的资源,并且在 IO-threads 中运行,因为必须进行性能调整才能产生。
由于这些资源分配和 transport-related 基础设施是 "expensive",.term()
-instance 方法会适当小心,不要损坏玩具,在交付之前仍在 IN/OUT-queues 内等待。我有没有提到 infrastructure-setup 和维护加上 message-delivery 机制是异步的并且不会发生,较少的被授予根据请求完成?不,它们在 Context()
实例引擎盖下以 best-effort 方式运行 "separately",具有 Zen-of-Zero(包括一个design-DNA...
您的代码已经放置了一条消息 "there",所以有一个 gold-egg,.term()
调用在最终杀死 [=11= 之前尽量避免损坏]-实例。
这种行为确实是期望的行为,并且可以根据其他情况进行更改:
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-versions ( 4.2+ ) 承诺已设置 zmq.LINGER
默认值而不是最初注入的 -1
== WAIT INDETERMINANTLY TILL DELIVERED, IF NOT FOREVER IN CASE NO PEERS ARE OUT THERE
所以应有的 design-side 关注确实是公平工程实践的标志 :o)