【问题标题】:pyzmq - zmq_req can I have one context and use several sockets?pyzmq - zmq_req 我可以有一个上下文并使用多个套接字吗?
【发布时间】:2020-10-18 19:45:06
【问题描述】:

我目前正在做一个 Benchmark 项目,我试图通过 zmq 请求对服务器施加压力。

我想知道解决这个问题的最佳方法是什么,我想有一个上下文来创建一个套接字并将其推送到一个线程中,我将分别在每个线程中发送请求并等待响应,但是我不太确定这是否可能与 python 的限制有关。

此外,是否所有线程都使用相同的套接字,也就是说,如果我正在等待一个线程上的响应(使用它自己的套接字),那么另一个线程是否有可能捕获该响应?

谢谢。

编辑: 测试流程逻辑是这样的:

客户端套接字将使用 zmq.REQ。 客户端发送消息。 客户端等待响应。 如果没有响应,客户端会重新连接并再次尝试直到限制。

我想将此操作扩展到任意数量的客户端,不喜欢处理进程,除非在性能方面差异显着..

你会怎么做?

【问题讨论】:

    标签: python message-queue benchmarking zeromq pyzmq


    【解决方案1】:

    Q“...我可以有一个上下文并使用多个套接字吗?”

    哦,当然可以。

    此外,您可以拥有多个Context()-instances,每个@-instances 管理 ... 几乎... 任意数量的Socket()-instances,每个@ 987654323@-instance 的方法可以从一个且只有一个 python 线程调用(Zen-of-Zero 规则:zero-sharing)。

    由于已知 GIL-lock re-[SERIAL]-isation 所有基于线程的代码执行流程,这仍然必须并且将等待获得 GIL-lock 所有权,这反过来又允许 GIL 锁所有者(并且没有其他人)在将 GIL 锁重新释放给其他线程之前执行固定数量的 python 指令......

    【讨论】:

    • 感谢您的快速回复。那么,对我来说,在同一个线程中打开 10k 个套接字,并循环遍历它们以让每个套接字发送消息然后让每个套接字等待响应是否明智?或者另一方面 - 我可以为每个工作人员打开一个进程,向它发送一个套接字,他的工作就是发送一条消息并等待响应。 (其中 10k 个)。
    • 这完全取决于您要测试的内容。缩放是 ZeroMQ 工具箱的一个强大功能。 Python 限制仍然存在。 GIL 锁是已知的 re-[SERIAL]-iser 技巧,它主要用于避免 的任何 种类-或-形式 >[CONCURRENT]-代码执行流程。所以,ZeroMQ 绝对不会阻碍朝着这个方向前进。
    • 感谢您的回答。我已经为此徘徊了一段时间 - 总是为我的客户找到一个新的限制,并且似乎无法打开新的套接字。我已经在不同的进程中尝试了多个上下文,并且我也尝试过提高这些上下文的 max_socket 限制。这给我带来了大约 8000 个应用程序的套接字。现在,我知道我们可以做得更好——我只是不知道怎么做。有什么想法吗?
    • 我很高兴我的答案和附加 cmets 确实帮助了你。随意 UpVote 并接受迄今为止提供给您的最佳答案。提出更多问题是进一步进行并解决您可能遇到的新问题和新问题的最佳方式。 StackOverflow 一直以这种方式工作,希望在未来几年也能如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多