![](/img/trans.png)
[英]Using Threadpool in an Async method without run_in_executor of asyncio.get_event_loop()
[英]Why get_event_loop Cannot Be Used With run_in_executor
誰能告訴為什么下面的代碼
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
ASYNC_INTERVAL = 0.1
def plain_hello_world(name):
s = "Hello world "+str(name)
print(s)
return s
def plain_loop(name, t):
start_time = time.time()
prev_time = start_time
while (time.time() - start_time < t):
if time.time() - prev_time > ASYNC_INTERVAL:
prev_time = time.time()
plain_hello_world(name)
def task1():
loop = asyncio.get_event_loop()
task = loop.run_in_executor(None, plain_loop, "func", 1)
loop.run_until_complete(task)
def task2():
loop = asyncio.get_event_loop()
task = loop.run_in_executor(None, task1)
loop.run_until_complete(task)
if __name__ == "__main__":
task2()
得到以下錯誤:
Traceback (most recent call last):
File "asyncio_practice4.py", line 28, in <module>
task2()
File "asyncio_practice4.py", line 25, in task2
loop.run_until_complete(task)
File "/usr/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete
return future.result()
File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run
result = self.fn(*self.args, **self.kwargs)
File "asyncio_practice4.py", line 18, in task1
loop = asyncio.get_event_loop()
File "/usr/lib/python3.6/asyncio/events.py", line 694, in get_event_loop
return get_event_loop_policy().get_event_loop()
File "/usr/lib/python3.6/asyncio/events.py", line 602, in get_event_loop
% threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.
題:
我不明白為什么會發生這樣的錯誤。
運行task1()
僅僅是罰款,但有一個沿另一run_in_executor()
它說沒有電流EVET環。 (但我認為應該,我沒有創建新線程)
有誰知道發生了什么?
假設我們只能在task2()
上工作,如何解決它?
筆記:
調用 2 run_in_executor()
的原因是因為上面的代碼正在模仿將第三個庫集成到 asyncio 代碼中。
plain_hello_world()
plain_loop()
和task1()
是碼的lib,這是我不能修改。
假設task1()
運行了 100 秒並且我不想等待它,所以我嘗試在 executor 中運行它,就像其他普通函數如何與 asyncio 一起工作一樣。
編輯:根據答案,這是有效的修訂:
def task2():
loop = asyncio.get_event_loop()
def wrapper():
asyncio.set_event_loop(asyncio.new_event_loop())
task1()
task = loop.run_in_executor(None, wrapper)
loop.run_until_complete(task)
雖然我不確定它有多“正確”或好。
我不明白為什么會發生這樣的錯誤。
這是因為task1
假設它將在主線程中運行(其中get_event_loop()
按需創建事件循環)或在先前調用set_event_loop
以設置事件循環的線程中set_event_loop
。 由於run_in_executor
在主線程以外的線程中調用其函數,並且您的代碼在調用它之前沒有調用set_event_loop()
,因此您會收到錯誤消息。
假設 task1() 運行了 100 秒並且我不想等待它,所以我嘗試在 executor 中運行它,就像其他普通函數如何與 asyncio 一起工作一樣。
運行同步函數而不等待它不是你用 asyncio 做的事情,它是常規線程的工作。 例如:
def task1_bg():
def work():
asyncio.set_event_loop(asyncio.new_event_loop())
task1()
threading.Thread(target=work).start()
if __name__ == '__main__':
task1_bg()
# do something else...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.