問題:將gevent和multiprocessing結合在一起與子進程進行通信
我可以使用multiprocessing模塊和Windows上的gevent以高效的方式嗎?
場景:
我有一個基於GEVENT Python應用程序在Windows上執行異步I/O。該應用程序主要是I/O綁定,但也有更高CPU負載的尖峯。此應用程序需要通過其stdin和stdout控制控制檯應用程序。我無法修改此控制檯應用程序,用戶將能夠使用他自己的自定義應用程序,只有基於文本(行)的通信協議已修復。
我有使用子和線程工作的實施,但我寧願用這些線程一起推動整個子基於通信的代碼放到一個單獨的進程中打開主應用程序恢復到單線程的。我打算爲此使用多處理模塊。
前閱讀:
我一直在網上搜索了很多,看了一些源代碼,所以我知道,多模塊使用基於Windows上命名管道一個管道實現。一對multiprocessing.queue.Queue對象將用於與第二個Python進程進行通信。這些隊列基於該管道實施,例如, IPC將通過命名管道完成。
關鍵的問題是,是否調用輸入隊列的get方法會阻止GEVENT的主循環與否。這種方法有一個超時,所以我可以把它變成一個有小超時的循環,但這不是一個好的解決方案,因爲它仍然會阻止小時間段內的危機,從而損害其低I/O延遲。
我也願意就如何規避使用Windows,這是衆所周知的是硬,有時脆弱管道的整個問題的建議。我不確定基於共享內存的IPC是否可以在Windows上使用。也許我可以用一種方式來包裝控制檯應用程序,這樣可以使用網絡套接字與子進程進行通信,這種方法已知可以和gevent很好地協作。
請不要如果可能的話質疑我的基本用例。謝謝。
我發現了一個適合在Windows和UNIX上異步讀取和寫入子過程管道的模塊。它可以與gevent的事件循環集成以獲得相當通用的解決方案:http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/ – fviktor 2011-04-08 20:50:07