fvi*_*tor 5 windows subprocess asynchronous multiprocessing gevent
题:
我可以在Windows上以高效的方式将多处理模块与gevent一起使用吗?
场景:
我有一个基于gevent的Python应用程序在Windows上进行异步I/O. 该应用程序主要受I/O限制,但也存在CPU负载较高的峰值.此应用程序需要通过其stdin和stdout控制控制台应用程序.我无法修改此控制台应用程序,用户将能够使用自己的自定义应用程序,只修复基于文本(行)的通信协议.
我有一个使用子进程和线程的工作实现,但我宁愿将整个基于子进程的通信代码与这些线程一起移动到一个单独的进程中,以将主应用程序转回单线程.我打算为此使用多处理模块.
事先阅读:
我一直在网上搜索并阅读一些源代码,所以我知道多处理模块在Windows上使用基于命名管道的Pipe实现.一对multiprocessing.queue.Queue对象将用于与第二个Python进程通信.这些队列基于该管道实现,例如IPC将通过命名管道完成.
关键问题是,调用传入的Queue的get方法是否会阻止gevent的主循环.该方法有一个超时,所以我可以把它变成一个带有小超时的循环,但这不是一个好的解决方案,因为它会在很短的时间内阻止gevent,从而损害其低I/O延迟.
我也对如何规避在Windows上使用管道的整个问题的建议持开放态度,这已知很难,有时甚至是脆弱的.我不确定在Windows上是否可以使用基于共享内存的IPC.也许我可以用一种允许使用网络套接字与子进程通信的方式来包装控制台应用程序,这已知可以与gevent一起使用.
如果可能的话,请不要质疑我的主要用例.谢谢.
小智 1
Queue 的 get 方法确实是阻塞的。使用超时可能会解决您的问题,但它绝对不是一个最干净的解决方案,而且最重要的是,它会无缘无故地引入额外的延迟。即使它没有阻塞,这也不是一个好的解决方案。仅仅因为非阻塞本身还不够,好的异步调用/API 应该顺利地集成到所使用的 I/O 框架中。可以是 Python 的 gevent、C 的 libevent 或 C++ 的 Boost ASIO。
\n\n最简单的解决方案是通过生成控制台应用程序并附加到其控制台输入和输出描述符来使用简单的 I/O。有两个主要因素需要考虑:
\n\n但是,缺点是您必须启动该应用程序,不支持与其并发通信,也不支持通过网络进行通信。甚至还有一个适合初学者的好例子。
\n\n为了保持简单但更灵活,您可以使用 TCP/IP 套接字。如果客户端和服务器都在同一台机器上运行。另外,一个好的操作系统会使用IPC作为底层实现,所以速度会很快。而且,如果您担心这种情况的性能,您可能根本不应该使用 Python 并考虑其他技术。
\n\n即使是喜欢的解决方案 \xe2\x80\x93 也使用ZeroC ICE。这是非常现代的技术,允许几乎无缝的进程间通信。它是一个CORBA杀手,非常容易使用。它被许多人大量使用,被证明是同类产品中速度最快且稳定的。该解决方案的优点在于您可以无缝集成许多不同语言的程序,例如 Python、Java、C++ 等。但这需要您花一些时间来熟悉概念。如果您决定这样做,只需花一天时间阅读文档即可。
\n\n希望能帮助到你。祝你好运!
\n