4Manuals

  • PDF Cloud HOME

使用线程在zmq req / rep模式的服务器端制作许多Replier套接字 Download

    如何将文本边界框与pyplot.Rectangle对齐? 导入类问题 在Python数据框中选择列时出错 使用Rabbit的pika确认消息 如何在按住键的同时暂停VideoStream? Python OpenCV TypeError:无法处理此数据类型 使用buildozer不会下载sdl2_image SMTPSenderRefused,421,超出超时 Tensorflow多线程推理比单线程推理慢 关于python中变量的困惑。 python如何使用变量?

由于我的工作原因,我使用zmq REQ / REP模式,决定在与主体不同的线程中进行服务器的转发器工作。我要显示的代码总结了这种方法:

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

为True时:

if not thr or not thr.is_alive():

    thr = threading.Thread(target = make_work, args= (context, )) 
    thr.start()`

我修改了pyzmq指南的hello world示例。所以,我的问题是,当我从Pieter Hintjens编写的文档运行hello world客户程序时,预期的行为是:对于我创建的每个线程,我打开的replier套接字将答案发送给客户程序,但是真正的行为是,在第一个线程之后,连接块的两侧。如果我在客户端进行轮询,然后重试发送,则成功,但这不是我想要的。是否有可能在服务器端的新线程中获得成功?

1 个答案:

答案 0 :(得分:0)

  

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

是的。

您的一半代码(客户端仍然不可见)效率很低。创建+设置+自建 distributed-computing 基础结构需要花费一些时间(重新实例化Socket实例,配置其本地端,要求操作系统提供.bind()的端口,等待其他人成功检测到.connect()的新对手,并实际上进行.connect()来建立并协商那里的链接,...), 除了一条消息和.close()以外的所有工作?

好吧,如果有人愿意。

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


此外,您的无限循环“重新设置”线程还具有其他从代码中看不到的副作用。除了上面概述的所有系统延迟(但每个呼叫都已重复)之外,还有一个(可能永远永久)阻止延迟- zmq.LINGER -一个秘密阻止程序。

ZeroMQ API的早期版本使用默认的zmq.LINGER == -1-能够在 .close() 方法上无限地阻塞。肯定是v4.3稳定的最新版本,使用zmq.LINGER的默认值1000 [ms]。

无论如何,专业的 distributed-computing 设计显式地控制实例参数并出于安全目的始终(无一例外)设置.setsockopt( zmq.LINGER, 0 )。

如果感兴趣,请随时阅读有关许多其他ZeroMQ posts

中 REQ/REP 相互僵局的其他无声危险的详细信息



Similar searches
    如何将SQL传递到R的dplyr? Samsung RF31FMEDBBC Refrigerator User Manual 使用NetBeans中的Maven Java应用程序制作可执行jar 如何使用xampp 在专业环境中,哪种方法更常见?