gpt4 book ai didi

zeromq - PyZMQ 是否为每个新的客户端连接创建线程?

转载 作者:行者123 更新时间:2023-12-01 01:13:58 26 4
gpt4 key购买 nike

我正在使用 PyZMQ 创建请求/回复服务器,并且我试图弄清楚为每个新客户端连接创建线程的行为是否由 PyZMQ 自动处理。最终,我试图弄清楚来自一个客户端的需要很长时间才能回复的请求是否会阻止来自所有其他客户端的请求。

通常,我会在 Python 套接字实例上调用 accept ,阻塞直到建立新连接,并在单独的线程中处理任何新连接。但是,PyZMQ 套接字似乎不支持这样的工作流程。那么,这在 PyZMQ 中是如何处理的呢?如果 PyZMQ REP 套接字有多个客户端连接到它,它如何正确地将回复路由回发出请求的客户端?而且,我如何设计我的代码,以便在客户端发出长时间运行的请求时不会阻止来自其他客户端的请求?

我知道我可以使用 PyZMQ 提供的基于 Tornado 的 EventLoop,我只是想更好地了解如果这不是一个选项,它将如何工作。

最佳答案

ZeroMQ 暴露为“类固醇套接字”,但还有另一种实现通信的方法。

首先,忘记连接传统套接字中的对等点的电线。在 0mq 中,您有一个“量子传送器”,它将您的消息从一段代码传送到另一段代码,从而对您隐藏实际的传送工作。您不能只询问 0mq 有多少客户端连接到套接字,或者您是否有客户端。因此,ZeroMQ 不能用作套接字的直接替代品。

相反,0mq 会给你一顶魔术师帽子,你可以从中取出一些白兔。想象一下,那顶帽子的底部与巨大的管道网络相连,另一边有多个奇妙的工厂。这些工厂有时会给你的帽子寄一些东西,当你从帽子里拿出来时,你会发现自己手里拿着一只兔子,或者一束鲜花或其他东西。除非在那件事上有明确的标签(即多部分消息的一部分指向消息的来源),否则您无法确定该事物是从哪个工厂发送的。

从帽子里取出兔子后,您可能想要发送一些东西,并且 0mq 对于不同的套接字类型会有不同的表现。对于 REP 套接字,它将直接向消息源发送应答,因为 DEALER 将在连接的对等方之间轮询应答,而 ROUTER 在接收消息时为您提供有关对等方的确切内部地址的大量知识,并允许您在发送消息时设置明确的目的地。

总而言之,如果您想为每个通信客户端使用单独的线程,则需要以下内容:

  • 客户应明确表明自己的身份。
  • 在服务器上,您运行一个线程(调度程序)来接收消息,从中获取客户端身份并选择一个线程进行处理。
  • Dispatcher 将此消息发送到线程(或产生一个)并继续为传入的消息流提供服务。
  • 线程接收消息,处理它并通过调度程序(如果需要)向客户端发送响应。
  • 调度程序将答案路由到客户端。

  • 这是一种在记住经典套接字知识的情况下实现“zeromq 上的多客户端套接字服务器”的方法。

    但这不是解决问题的 0mq 方法。

    在 0mq 中,您可以将处理逻辑放在一个线程中(上面示例中的调度程序)并将其实现为循环 receive request -> process -> send answer -> receive ... .当处理时间不是问题时非常适合。但是当它是时,0mq 风格的解决方案涉及客户端和工作人员(执行实际工作)之间的任务队列代理。然后,broker 逻辑比上面提到的接收-应答循环稍微复杂一点,而且工作线程的实现方式相同。请参阅 zguide 中的示例 - A Request-Reply Message Broker

    关于zeromq - PyZMQ 是否为每个新的客户端连接创建线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124359/

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