import asyncio
import time
from concurrent.futures.thread import ThreadPoolExecutor
def commonmethod(value):
print(value)
time.sleep(2)
print('done')
return "it is ok"
async def main(value):
# 获取当前正在执行的事件循环
loop = asyncio.get_running_loop()
# 使用run_in_executor 执行非协程函数
# 第一步是调用ThreadPoolExecutor的submit方法,去线程池中申请一个线程执行commonmethod方法,并返回一个concurrent.futures.Future对象
# 第二步 调用asyncio.wrap_future将concurrent.futures.Future转换成asyncio.Feture
# 第一个参数为None,默认使用线程池
# result = loop.run_in_executor(None,commonmethod,value)
# response = await result
# print(response)
# 显示的声明线程池
with ThreadPoolExecutor(max_workers=10) as worker:
result = loop.run_in_executor(worker,commonmethod,value)
response = await result
print(response)
# 将协程对象添加到事件循环中,并运行
tasks=[main(i) for i in range(5)]
# 可以wait的对象包括:协程对象,task
# asyncio.run会创建一个事件循环,并将携程对象加入到事件循环
asyncio.run(asyncio.wait(tasks))
future
import asyncio
async def test(fu):
print(1)
await asyncio.sleep(2)
fu.set_result(666)
async def main():
# 获取当前正在执行的事件循环
loop = asyncio.get_running_loop()
fu = loop.create_future()
# 创建task对象,加入到事件循环中
task= asyncio.create_task(test(fu))
await task
# 等待返回值
response = await fu
print(response)
asyncio.run(main())