簡體   English   中英

Python 線程安全異步

[英]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.

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