Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用线程在ZeroMQ REQ/REP模式的服务器端创建多个replier套接字_Python_Multithreading_Networking_Zeromq_Distributed Computing - Fatal编程技术网

Python 使用线程在ZeroMQ REQ/REP模式的服务器端创建多个replier套接字

Python 使用线程在ZeroMQ REQ/REP模式的服务器端创建多个replier套接字,python,multithreading,networking,zeromq,distributed-computing,Python,Multithreading,Networking,Zeromq,Distributed Computing,出于我工作的原因,使用ZeroMQREQ/REP模式,我决定让服务器的replier在与主体不同的线程中工作。我将要展示的代码总结了这种方法: import time import zmq import threading def make_work(context): socket = context.socket(zmq.REP) socket.bind("tcp://*:5555") message = socket.recv() print("Rec

出于我工作的原因,使用ZeroMQ
REQ/REP
模式,我决定让服务器的replier在与主体不同的线程中工作。我将要展示的代码总结了这种方法:

import time
import zmq
import threading


def make_work(context):
    socket = context.socket(zmq.REP)
    socket.bind("tcp://*:5555")

    message = socket.recv()
    print("Received request: %s" % message)

    #Do some 'work'
    time.sleep(1)

    #Send reply back to client
    socket.send(b"World")
    socket.close()



 context = zmq.Context()
 thr = None

 while True:

    if not thr or not thr.is_alive():

        thr = threading.Thread(target = make_work, args = (context, ) )
        thr.start()
我修改了pyzmq指南的helloworld示例。所以,我的问题是,当我从Pieter Hintjens制作的文档运行hello world客户端时,预期的行为是:对于我正在创建的每个线程,我打开的replier套接字将答案发送给客户端,但真正的行为是,在第一个线程之后,连接的两侧都会阻塞。如果我在客户端进行轮询,然后重试发送,这是成功的,但这不是我想要的。是否可能在服务器端的新线程中成功接收

Q:是否可以在服务器端的新线程中成功接收

是的

您的一半代码(客户端仍然不可见)的效率非常低。创建+设置+自行建立基础结构需要一些时间(重新实例化
套接字
-实例,配置其本地端,要求O/S为
.bind()
提供端口,等待其他人成功检测到
.connect()
的新对手,并实际执行
.connect())
要设置和协商一条消息,只需一条消息和
.close()

好吧,如果你愿意的话

智能系统可以重复使用资源,而无需为已经支付的费用支付两次,即更少的次数


另外,您的无限循环“重新安装”线程会带来代码中没有看到的其他副作用。除了上面所描述的所有系统性延迟(但每次调用都会重复)之外,还有一个潜在的永久性阻塞延迟——
zmq.LINGER
——一个秘密阻塞器

ZeroMQ API的早期版本使用的默认值为
zmq.LINGER==-1
——能够在
.close()
方法上执行非常长的块。最新版本的v4.3-stable肯定使用
zmq.LINGER
默认值
1000[ms]

无论如何,出于安全目的,专业的设计明确控制实例参数并设置
.setsockopt(zmq.LINGER,0)
,始终没有例外


如果有兴趣,请随意阅读更多关于其他许多

Hi,@user3666197!
REQ/REP
相互死锁的其他无声危险的详细信息!,谢谢你阅读我的帖子。还有几个人考虑这个问题。正如我在文章中所述,代码的客户端是PieterHintjens所做的文档的HelloWorld客户机。我的项目不是一个专业项目,而是一个公文包项目。否则,谢谢你关于效率低下的建议。另一方面,在我最初的项目中,我需要服务器端的可访问性,以便在我执行其他活动时继续接收消息,这必须使用请求者套接字。如果我为每个请求者打开一个线程,并将应答器套接字保留在原始线程中…(并且在程序运行之前从不关闭它),我会得到同样的低效率?