[英]multithreading for IO-bound tasks and multiprocessing for CPU-bound tasks
https://realpython.com/async-io-python/介紹了多線程和多處理,但沒有說明什么是一般有效或僅在 Python 環境中有效。 例如,它說:
並發包括多處理(適用於 CPU 密集型任務)和線程(適用於 IO 密集型任務)
我之前用 C/C++ 等其他編程語言開發了並發應用程序,這句話對我來說似乎很奇怪。 為什么多線程通常不適合 CPU 密集型任務和 IO 密集型任務的多處理? AFAIK 都可以有效地用於這兩項任務。 兩者之間的決定取決於其他標准,例如任務粒度、共享狀態的數量和任務之間的執行順序依賴性以及進程/線程創建成本(進程更高,尤其是在某些操作系統中)。 上面的語句是否特定於 Python 環境及其全局鎖解釋器限制?
正如 Go 語言的共同發明者 Rob Pike 所說:
來自 Luciano Ramalho 的書,“Fluent Python”第 18 章,第 557 頁。
他們想說的是,當您確實需要多個 CPU 綁定任務或並行任務時,多處理(它也是 Python 中用於並行的庫的名稱)是解決問題的方法。 在 Python 中,這是通過使用Python Multiprocessing 模塊等繞過 GIL 來實現的
在 Python 中,有一種叫做 GIL 的東西,它允許一次只運行一個線程。 您需要繞過 GIL 才能使用並行性。 同時,即使有 GIL 限制,您也可以實現並發:一次只能運行一個線程!!
在 Python 中,您可以通過以下方式實現並發:
正如你所看到的,你有 3 種並發方式,但由於 GIL 的限制,你不能在並行任務或 CPU 密集型任務中使用它
我找到了一篇可以幫助您處理並發和異步 I/O 的文章
要在 Python 中實現並行性,您需要繞過 GIL。 一個有助於解決這個問題的 python 模塊稱為“多處理”。
關於你的疑惑:
...(它說多處理適用於 CPU 密集型任務,多線程適用於 IO 密集型任務)僅適用於 Python 環境。
我不能說它是否只適用於 Python,因為我不了解所有其他語言,但例如,Javascript 以其異步 I/O 方法而臭名昭著,同時 C#、C++、Java 實現並發和並行,沒有任何不便或限制使用線程。 C# as JavaScript 很久以前也實現了異步 I/O。
David Beazley 和 Łukasz Langa 在下面的談話中都提到了這個事實
David Beazley,2015 年巴西 PyCon 主題演講
David Beazley, Curious Course on Coroutines and Concurrency
Łukasz Langa,協程思考 - PyCon 2016
鏈接也在下面的演示文稿中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.