问题:
我可以在 Windows 上以有效的方式将多处理模块与 gevent 一起使用吗?
设想:
我有一个基于 gevent 的 Python 应用程序在 Windows 上执行异步 I/O。该应用程序主要受 I/O 限制,但也存在较高 CPU 负载的峰值。此应用程序需要通过其标准输入和标准输出来控制控制台应用程序。我无法修改此控制台应用程序,用户将能够使用他自己的自定义应用程序,只有基于文本(行)的通信协议是固定的。
我有一个使用子进程和线程的工作实现,但我宁愿将整个基于子进程的通信代码与这些线程一起移动到一个单独的进程中,以将主应用程序转回单线程。我计划为此使用多处理模块。
预读:
我一直在网上搜索并阅读了一些源代码,所以我知道多处理模块正在使用基于 Windows 上命名管道的管道实现。一对 multiprocessing.queue.Queue 对象将用于与第二个 Python 进程通信。这些队列基于该管道实现,例如 IPC 将通过命名管道完成。
关键问题是,调用传入 Queue 的 get 方法是否会阻塞 gevent 的主循环。该方法有一个超时,所以我可以将它变成一个小超时的循环,但这不是一个好的解决方案,因为它仍然会在小时间段内阻塞 gevent,从而损害其低 I/O 延迟。
我也愿意接受有关如何规避在 Windows 上使用管道的整个问题的建议,众所周知,管道很困难,有时很脆弱。我不确定在 Windows 上是否可以使用基于共享内存的 IPC。也许我可以以一种允许使用网络套接字与子进程通信的方式包装控制台应用程序,众所周知,这与 gevent 配合得很好。
如果可能,请不要质疑我的主要用例。谢谢。