![](/img/trans.png)
[英]Is python asyncio call_soon_threadsafe really thread-safe?
[英]Python thread safe asyncio
我正在嘗試使用 asyncio.run_in_executor 運行我的同步功能
我的協程共享數據和更新數據。 run in executor 啟動線程。 我需要讓我的對象線程和異步安全嗎?
import asyncio
from concurrent.futures import ThreadPoolExecutor
class shared:
#complex object
def func(a, b):
# blocking calls
return a + b
async def main(loop):
result = await loop.run_in_executor(None, func, "Hello,", " world!")
UpdateSharedObject(result)
Start main as 5 tasks using create_task
如果您正在從不同的線程訪問(尤其是進行更改)相同的資源。 然后我強烈推薦使用 同步原語。 因為 Python 並非在所有情況下都提供這種線程安全。 許多 Python 操作是原子的,但不是全部。 實際上,單個操作碼是線程安全的。
線程安全操作的示例:
L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
這些不是:
i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1
更多信息: https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe
至於asyncio
,我同意評論中的@user4815162342 並建議您重新設計程序,以便在線程中執行的函數是純函數,並且不會更改共享對象。 因為使用線程同步以及協作多任務( asyncio
)會使代碼變得非常復雜並導致細微的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.