gpt4 book ai didi

tcp - PyZMQ - 如果没有建立连接如何终止上下文?

转载 作者:可可西里 更新时间:2023-11-01 02:50:21 27 4
gpt4 key购买 nike

我一直在想办法在我的套接字尚未连接到绑定(bind)地址时如何关闭 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() block 无法 ^C 出来。它打印出“我到了这里!”在它停止之前,顺便说一句。

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

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-instance 作为自主战场单元。它拥有自己的资源并在尽可能多的 IO 线程中运行,因为性能调整必须产生。

由于这些资源分配和与运输相关的基础设施“昂贵”,.term()-instance 方法会适当小心,不要损坏玩具,这仍然在 IN/OUT 队列中等待,在交付之前。我有没有提到基础设施设置和维护以及消息传递机制都是异步的并且不会发生,越少的被授予根据请求完成?不,它们在 Context() 实例罩下“单独”运行,以尽力而为的方式,具有 Zen-of-Zero(包括零- “保修”)在设计 DNA 中...

您的代码已经在“那里”放置了一条消息,所以有一个金蛋,.term() - 调用在最终杀死 Context 之前尽量不损坏-实例。

这种行为确实是期望的行为,并且可以根据情况更改它,否则会采取适当的设计注意事项:

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

即使较新的 native ZeroMQ API 版本 ( 4.2+ ) promise 设置 zmq.LINGER 默认值而不是最初注入(inject)的 -1 == 不确定地等待直到交付,如果不是永远等待,以防没有同行在那里

所以适当的设计方面的关注确实是公平工程实践的标志 :o)

关于tcp - PyZMQ - 如果没有建立连接如何终止上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com