PyZMQ 是否处理为每个新客户端连接创建线程?

2024-04-26

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

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

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


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

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

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

在你从帽子里取出兔子后,你可能想发回一些东西,0mq 对于不同的套接字类型会有不同的行为。对于 REP 套接字,它将直接向消息源发送应答,对于 DEALER 来说,它将在连接的对等点之间循环应答,而 ROUTER 在接收消息时让您了解对等点的确切内部地址,并允许您在发送消息时设置显式目的地。

总而言之,如果您希望每个通信客户端都有一个单独的线程,则需要以下内容:

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

这是一种利用经典套接字知识实现“zeromq 上的多客户端套接字服务器”的方法。

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

在 0mq 中,您可以将处理逻辑放在一个线程中(上面示例中的调度程序)并将其实现为一个循环receive request -> process -> send answer -> receive ...。当处理时间不成问题时,非常适合。但当它出现时,0mq 式的解决方案涉及客户端和工作人员(执行实际工作)之间的任务队列代理。然后,代理逻辑比上面提到的接收-应答循环稍微复杂一些,并且工作器以相同的方式实现。请参阅 zguide 中的示例 -请求-回复消息代理 http://zguide2.zeromq.org/py%3aall#toc53

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyZMQ 是否处理为每个新客户端连接创建线程? 的相关文章

随机推荐

  • Python中的非阻塞套接字?

    是我 还是我找不到关于Python中非阻塞套接字的好教程 我不确定如何准确地工作 recv和 send在里面 根据 python 文档 至少是我的理解 recv ed or send ed 数据可能只是部分数据 那么这是否意味着我必须以某种
  • 数组对象内相同值的重复分组

    id year 2017 month 4 Confirm 0 id year 2017 month 4 Expired 25 id year 2017 month 4 Pending 390 id year 2017 month 5 Pen
  • 构建启用 COM 互操作的项目,而无需在构建过程中注册它

    在 Visual Studio 2010 中 我尝试构建一个启用 COM 互操作的 C 项目 但在构建过程中不注册它 但我DO需要程序集的类型库 tlb 文件 因此我可以从解决方案中的另一个 C 项目导入它 我还没有找到一种方法来做到这一点
  • KafkaStreams 同一应用程序中的多个流

    我正在尝试根据 KafkaStreams 的惯例和合理性做出实用的设计决策 假设我想将两个不同的事件放入其中KTables 我有一个制作人将这些消息发送给KStream那就是听那个话题 据我所知 我不能对消息使用条件转发KafkaStrea
  • 如何将函数应用于嵌套列表?

    我需要获取嵌套列表中变量的最大值 对于某个站号 s 和某个成员 m mylist s m 其形式为 station date time member bias 6019 2011 08 06 12 00 mbr003 86 6019 201
  • URLError:

    只是想让这段代码直接运行它的基本代码Python 金融 import datetime import matplotlib pyplot as plt from matplotlib finance import quotes histor
  • 复制/粘贴到 Word 时如何保留 rstudio 的格式?

    我想在 Word 2010 中重现我的代码 脚本是用 rstudio 编写的 我想在粘贴到 Word 时保留 rstudio 的格式 主要是 我喜欢 rstudio 使用的字体颜色和间距 我发现当我从 SAS 粘贴到 Word 时 格式会被
  • 如何为pandas数据框中的不同组分配唯一的ID?

    如何根据特定条件为 pandas 数据框中创建的组分配唯一 ID 例如 我有一个名为 df 的数据框 其结构如下 名称标识用户 日期时间标识用户访问资源的日期 时间 Name Datetime Bob 26 04 2018 12 00 00
  • 未找到 Firebase 框架

    我一直在尝试将我的项目迁移到 cocoapods 我觉得我快到了 但我陷入了困境 ld 找不到架构 x86 64 的 Firebase 框架 错误 链接器命令失败 退出代码为 1 使用 v 查看调用 我正在尝试使用我的 app xcwork
  • SwiftUI 预览的 Xcode Canvas 不显示

    我正在尝试从 Xcode 11 运行新的 Canvas 功能 但 Canvas 不会显示 我究竟做错了什么 这个新的 Xcode 功能应该在不运行应用程序的情况下显示我的 SwiftUI 视图的实时预览 当您使用 SwiftUI 创建自定义
  • 图像调整大小性能:System.Drawing 与 System.Windows.Media

    我遇到了需要调整大量图像大小的情况 这些图像目前在文件系统上存储为 jpg 文件 但我希望稍后在项目中内存中只有 byte 源图像大小是可变的 但输出应该是 3 个不同的预定大小 应保留长宽比 用空白填充原始图像 即 将调整非常高的图像大小
  • 未知处理时间的进度条

    我正在开发启动 停止 重新启动 Windows 服务的 winform c 我想放置一个进度条 直到操作完成 我是 net 编程新手 请帮助我实现这一目标 当您不知道需要多长时间时 您就无法展示有意义的进展 您无法知道 服务启动需要 1 到
  • 使用 Postman 获取并存储 cookie 的值 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要获取 cookie 的值 该值仅在我在邮递员中发送请求时创建 我已经尝试了一切 但我不知道如何实现这一目标 我还需要存储该值以便在我的
  • 根据具体数据计算锯齿波和三角波

    我需要计算三角形和锯齿波 但由于我的模型和我能够使用的数据 它有点复杂 但也许我只是感到困惑 我能够计算我的正弦波 但我并没有真正使用帧计数器 我所做的是 计算theta increment下次需要计算样本时可以使用的变量 这工作起来是这样
  • 根据时间变量对两个表中的一对 COUNT 求和

    花了一个多小时的时间寻找这个问题的答案 但运气不佳 我有两个具有相同列名的区域表 我可以根据以下查询为任一表提供结果列表 将 Table2 替换为 Table1 SELECT Table1 YEAR FORMAT COUNT Table1
  • GitHub Actions 工作流程不响应其他工作流程中的推送事件

    我创建了一个工作流程 在推送分支 A 时自动将分支 A 合并到分支 B 中 并创建了一个在推送分支 B 时运行的工作流程 但是 当推送分支 B 时 工作流不会运行 这是 GitHub 规范吗 如果是这样 我想知道是否有文档或问题明确说明了这
  • 基于 GPO DisplayName 而不是 Id 备份 GPO

    因此 我正在备份域控制器的所有 GPO 我注意到 Backup GPO cmdlet 备份 GPOS 的方式非常不友好 默认情况下 它为每个以 ID 命名的 GPO 创建一个文件夹 该文件夹甚至与其 GPOID GUID 不匹配 这是一个示
  • AWS Elastic Beanstalk 无效的二进制包

    我正在致力于将项目从 Heroku 迁移到 AWS 部署后我不断收到错误消息 无效的 ELF 标头 我在使用 AWS Lambda 时发现了类似问题的帖子 但我不明白为什么 Elastic Beanstalk 中的二进制包会出现问题 Ela
  • 我需要异常排序 mysql 结果

    我正在尝试从当前日期开始对结果进行升序排序 这就是我现在使用的 SELECT FROM friends JOIN bdays ON bdays user friends friendname WHERE username userid OR
  • PyZMQ 是否处理为每个新客户端连接创建线程?

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