我希望能够同时异步运行阻塞和非阻塞任务。显然,需要使用asyncio中的run_in_executor方法来处理阻塞任务。以下是我的示例代码:
import asyncio
import concurrent.futures
import datetime
import time
def blocking():
print("Enter to blocking()", datetime.datetime.now().time())
time.sleep(2)
print("Exited from blocking()", datetime.datetime.now().time())
async def waiter():
print("Enter to waiter()", datetime.datetime.now().time())
await asyncio.sleep(3)
print("Exit from waiter()", datetime.datetime.now().time())
async def asynchronous(loop):
print("Create tasks", datetime.datetime.now().time())
task_1 = asyncio.create_task(waiter())
executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)
task_2 = loop.run_in_executor(executor, blocking)
tasks = [task_1, task_2]
print("Tasks are created", datetime.datetime.now().time())
await asyncio.wait(tasks)
if __name__ == "__main__":
try:
loop = asyncio.get_event_loop()
loop.run_until_complete(asynchronous(loop))
except (OSError) as exc:
sys.exit('Exception: ' + str(exc))
在run_in_executor中,我应该使用相同的事件循环来处理阻塞任务,还是需要使用另一个?为使代码异步执行,我应该更改哪些内容?谢谢
None
作为第一个参数传递给run_in_executor
,它将使用由asyncio为事件循环创建的线程池。 - user4815162342None
传递给run_in_executor
将使用 asyncio 自己的线程池,这个线程池就是为此而存在的。该线程池仍然有自己的线程,并且不会阻塞事件循环线程。 - user4815162342