簡體   English   中英

Python threading.Semaphore vs asyncio.Semaphore

[英]Python threading.Semaphore vs asyncio.Semaphore

我最近注意到在 python 的不同包中有兩種不同的信號量實現,一種在threading包中,另一種在asyncio包中。 我很好奇這兩種實現有什么區別? 如果在異步函數中我嘗試使用threading包中的信號量,這會導致任何潛在問題嗎?

並通過查看python官方文檔,它寫道

asyncio primitives are not thread-safe, therefore they should not be used for OS thread synchronization (use threading for that)

但是,說asyncio primitives are not thread-safe and should not be used for OS thread sync什么意思?

提前致謝

信號量的整個目標是提供對某些東西的獨占訪問。 任何時候只有一個“代碼”可以訪問自己的信號量。

我在前面的語句中所說的“代碼段”是什么意思取決於我使用的是多線程、多處理還是 asyncio。 您保證獨占訪問的方式取決於我使用的內容。

Asyncio 是最受限制的一種多線程。 一切都在單個 Python 線程中運行。 Python 解釋器一次只執行一件事。 每個“代碼段”都會運行,直到它自願等待某事發生。 然后允許運行另一個“代碼段”。 最終,當它等待的事情發生時,原始代碼再次運行。

使用多線程時,多段代碼在 Python 解釋器中運行。 任何時候都只有一段代碼運行,但它們並沒有禮貌地等待對方。 Python根據需要從“代碼段”切換到“代碼段”。

通過多處理,多個 Python 可以同時運行。 除了操作系統提供的代碼外,代碼段之間沒有共享。 設置信號量通常需要操作系統的一些支持來創建所有線程/進程都可以訪問的共享變量。

所以。 Asyncio 原語的設計使得它們都在一個單獨的 Python 進程中運行,並且進程相互協作。 如果多段代碼試圖同時使用它,它們就不能工作。

我希望這有幫助。

您無法選擇使用哪個隊列或哪個信號量。 它們不兼容。

即使它們都提供並發性, asyncio和多線程也是基於不同原理和 API、具有不同典型用例等的兩個完全不同的世界。

多線程程序的開發並不容易,Python 的一個稱為 GIL 的特性使它們沒有達到應有的效率。 這使得 asyncio 成為首選,除非您被迫使用多線程。


話雖如此,這兩種方法都可以在一個程序中使用。

在多線程應用程序的線程之一中運行異步代碼是可能的,但並不常見。 文檔中引用的通知提醒您,幾乎所有異步操作都必須在該線程中執行。 只有少數專門的線程安全低級調度函數

為了完整起見, asyncio庫可以利用線程池供其內部使用,因為所謂的阻塞操作不應由異步程序執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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