2015-09-28 144 views
5

根據我的理解,線程不能並行執行(基於可用性和隨機執行),這就是使用Eventlet的原因。Python多重處理vs Eventlet

如果Eventlets更多的是爲了並行性,爲什麼我們不能只使用Python的多處理模塊。

我想過執行多個進程模塊,並使用join方法()來檢查所有進程是否完成。

有人可以解釋我的理解是否正確嗎?

+1

我可能是錯誤的,但從我讀過的Eventlet(從未聽說過,感謝提示),它執行非阻塞IO,因此允許執行流從一個動作傳遞到下一個動作在游泳池。那麼,儘管由於GIL,CPython中的線程並不是並行運行,但下一個線程可以在IO操作中被阻塞時運行。所以理論上應該沒有太大的區別(除了易於編程)。任何人都可以請確認/糾正我的思路? – Pynchia

回答

0

基於我的理解,線程不能並行執行(執行基於可用性和隨機的)

正確

並且那正在使用Eventlet的原因。

不太正確。 Eventlet庫用於簡化非阻塞IO編程。它並不是實際上增加了並行性。由於GIL,線程執行仍然限於一次一個線程。但它的使用是因爲它極大地簡化了啓動,調度和管理IO綁定線程的過程,尤其是那些不需要彼此交互的線程。

如果Eventlets更多的並行

正如我剛纔提到的,這不是他們的存在的東西。

爲什麼我們不能只使用Python的多處理模塊。我想過執行多個進程模塊並使用join方法()來檢查所有進程是否完成。

你當然可以!你會得到這種方法的實際並行執行。但是你可能無法獲得相同的加速比。多處理庫更適合CPU綁定的並行任務,因爲這些需要更頻繁地訪問解釋器。由於多個流程執行和管理的開銷,在使用IO界限任務使用多處理時,實際上可能會看到執行時間的增加。


如同最優化和執行時間的問題,試圖既和分析的情況下,是保證你使用你的應用程序中的「最佳」選項的正確的方式。儘管您可能會發現,如果您先編寫代碼以利用Eventlets,然後嘗試修改它以使用常規線程或多處理,則必須編寫更多樣板代碼才能管理線程或進程,並且Eventlets的值應該變得更加明顯。