Python3 asyncio 异步 并行 协程 线程 非阻塞

1,390 阅读1分钟

疑问

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