疑问
Python在执行异步并行方法已经有一些内部方法,比如线程,线程池,进程,进程池等(这里不列举第三方工具);不过这几个方法都得创建个类,把这些动作塞进去,再声明这个类然后去run;能不这么麻烦么?
关键词
- asyncio、run、sleep、gather、to_thread、ensure_future
试试
- 用
asyncio,执行的方法已经写好了,不用搁到哪个类里。
import asyncio
import time
async def test1():
await asyncio.sleep(2)
with open("a.txt", "a") as a:
a.write(f"1, {time.time()}\n")
async def test2():
await asyncio.sleep(1)
with open("a.txt", "a") as a:
a.write(f"2, {time.time()}\n")
- Python3.8 & Python3.9
if __name__ == "__main__":
# 并行运行任务
async def main():
await asyncio.gather(test1(), test2())
asyncio.run(main())
- Python3.9多一个方法
if __name__ == "__main__":
# 不同的线程中并行运行任务
async def main():
await asyncio.gather(
asyncio.to_thread(test1()),
asyncio.to_thread(test2())
)
asyncio.run(main())
- 结果,都是test2先运行的,总时间2s
2, 1622082423.2318707
1, 1622082424.234013
- 由于
asyncio.run执行后事件loop就结束了,那如何非阻塞的run单个异步方法呢?
if __name__ == "__main__":
asyncio.ensure_future(test1())
asyncio.ensure_future(test2())
看这里
https://docs.python.org/zh-cn/3/library/asyncio-task.html