2011-04-19 124 views
10

我需要在Python中編寫一個類似於程序的代理,工作流程與Web代理非常相似。該程序位於客戶端和服務器之間,包含客戶端發送給服務器的請求,處理該請求,然後將其發送到原始服務器。當然,使用的協議是使用TCP的私有協議。混合Python與多處理扭曲?

爲了儘量減少工作量,我想使用Python Twisted來處理請求接收(該部分充當服務器)和重新發送(該部分充當客戶端)。爲了獲得最大的性能,我想使用python multiprocessing(線程具有GIL限制)將程序分成三個部分(進程)。第一個進程運行Twisted接收請求,將請求放入隊列中,並立即返回成功到原始客戶端。第二個進程從隊列中獲取請求,進一步處理請求並將其放入另一個隊列。第三個進程從第二個隊列獲取請求並將其發送到原始服務器。

我是Python的新角色Twisted,我知道它是事件驅動的,我也聽說最好不要將Twisted與線程或多處理混合在一起。所以我不知道這種方式是否合適,或者是否有更簡單的方法,只需使用Twisted?

+0

我懷疑使用3個進程,而不是1是多餘的。第一個和最後一個進程不會執行任何CPU綁定處理......它們只是IO綁定。通過實際將所有內容放入一個沒有線程和只有異步/事件庫邏輯的Twisted reactor進程中,您可能會獲得更好的可維護性和更好的執行結果。 – 2012-03-22 13:43:10

回答

4

ampoule是我在閱讀你的問題時首先想到的。

這是一個簡單的進程池實現,它使用AMP protocol進行通信。您可以使用deferToAMPProcess函數,它非常易於使用。

17

扭曲有自己的事件驅動的方式運行子過程是(在我的謙虛,但正確的意見)比multiprocessing模塊更好。核心API是spawnProcess,但像ampoule這樣的工具提供了更高級別的包裝器。

如果您使用spawnProcess,您將能夠像處理Twisted中的任何其他事件一樣處理子流程的輸出;如果您使用multiprocessing,則需要開發自己的基於隊列的方式,以便以某種方式將子流程的輸出獲取到Twisted主循環中,因爲線程可能使用的正常的callFromThread API將不適用於其他進程。根據你如何調用它,它會嘗試醃製反應器,或者只是在子過程中使用不同的非工作反應器;無論如何,它會永遠失去你的電話。

+0

這似乎是我預期的答案,謝謝雕文。不過,我仍然在學習Twisted,並不完全理解你提到的術語,如Twisted的「spawnProcess」或「callFromThread」,我會回過頭來讓你知道我什麼時候開始編寫代碼。 – benhengx 2011-04-20 09:12:57

+1

'spawnProcess'總是一個鏈接,但現在'callFromThread'也是。他們會帶你到Twisted API文檔,希望能夠清楚說明它們的含義:)。 – Glyph 2011-05-16 13:14:26

+1

比api文檔更具親和力的文檔:[使用流程](https://twistedmatrix.com/documents/current/core/howto/process.html) – jfs 2014-05-09 02:01:18