![](/img/trans.png)
[英]Python asyncio gather returned value from '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.