【问题标题】:Is it possible to send one message to multiple receiving sockets in constant time?是否可以在恒定时间内将一条消息发送到多个接收套接字?
【发布时间】:2018-09-07 06:25:57
【问题描述】:

这更普遍,但我最近需要通过 Python 中的 UNIX 域套接字将通过 WebSocket API 接收到的大量消息发送到多个子进程。纯线程别无选择,因为我需要真正的并发性(希望我不会将其与并行性混淆),因此只剩下进程。在主进程和子进程之间共享内存会带来比让它们都只在自己的套接字上侦听更大的开销。

过程如下:

  1. 主进程中的线程监听传入的 WebSocket 消息并将其放入队列中
  2. 主进程忙转并检查队列中是否有新消息,如果有,则将其发送给多个(可能大约 3-4 个)子进程。

在分析上述脚本后,我发现每个子进程发送一条消息大约需要 3 毫秒。考虑到对高吞吐量的需求,我宁愿每条消息等待 3 毫秒,也不愿在 3 个子进程的情况下等待 9 毫秒。有没有可能把这个时间从O(n)缩短到O(1)?

到目前为止,我只想到了异步,但如果可能的话,我不想使用它。

【问题讨论】:

  • 基本上你想发布订阅模型。你试过任何消息队列吗?例如卡夫卡..
  • 3ms 很多,即使对于 Python 也是如此。您究竟是如何发送消息的?

标签: python python-multithreading python-asyncio


【解决方案1】:

如果您可以创建一组固定的子进程,即一组有 3/n 个进程并且您选择一组并转发给所有子进程,那么您可以考虑为每个子进程集使用一个多播 IP/套接字。

或者如果子处理开销不是很重要,您可以让所有子进程监听同一个多播组,这意味着所有子进程都从主进程获取所有消息并检查消息参数以确定消息是否针对它与否。

多播 IP 进行第 2 层广播,因此数据包仅在线发送一次,并且多播组中的所有套接字同时读取相同的消息。

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多