簡體   English   中英

IO 密集型任務的多線程和 CPU 密集型任務的多處理

[英]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 中,您可以通過以下方式實現並發:

  • 線程,
  • 期貨(基於線程)
  • 和異步 I/O(不是基於線程,而是基於事件循環和協作多任務)

正如你所看到的,你有 3 種並發方式,但由於 GIL 的限制,你不能在並行任務或 CPU 密集型任務中使用它

我找到了一篇可以幫助您處理並發和異步 I/O 的文章

Python 中的並發與異步 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM