簡體   English   中英

python asyncio call_soon_threadsafe真的是線程安全的嗎?

[英]Is python asyncio call_soon_threadsafe really thread-safe?

我看到一些使用asyncio作為異步任務隊列的代碼。 也許喜歡以下

async def _send_email(address):
    pass

def send_email(address):
    task = asyncio.tasks.ensure_future(_send_email(address))
    task.add_done_callback(callback)

def init_worker(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()

@app.route("/notify")
def do_jobs():
    # some code
    loop.call_soon_threadsafe(send_email, address)

loop = asyncio.new_event_loop()
worker = threading.Thread(target=init_worker, args=(loop,))
worker.setDaemon(True)
worker.start()

app.run()

我讀了call_soon_threadsafe的實現。 它會將任務追加到loop._ready這里的代碼。

self._ready.append(handle)

但是當子線程正在執行_run_once ,從loop._ready彈出任務, 這里的代碼。

handle = self._ready.popleft()

我不確定競爭條件是否存在。 如果它不存在,在什么情況下應該使用queue.Queue

原諒我可憐的英語。

根據https://bugs.python.org/issue15329#msg199368

deque的append(),appendleft(),pop(),popleft()和len(d)操作在CPython中是線程安全的。

在同一條消息中有關於Queue的信息:

那么,deque是否可以更快地替換Queue.Queue?

是的,它更快。 Queue模塊本身在內部使用deque。 並且通過鎖定,函數間接以及諸如maxsize,join和task_done之類的附加功能,Queue會稍微減慢速度。

deque只是一個數據結構,但Queue(以及asyncio.Queue)提供了更多功能,允許更靈活的控制流。

暫無
暫無

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

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