当前位置: 首页 > 工具软件 > asyncio > 使用案例 >

asyncio理解

邵浩大
2023-12-01
import threading
import asyncio

@asyncio.coroutine
def hello():
    print('Hello world! (%s)' % threading.currentThread())
    yield from asyncio.sleep(1)
    print('Hello again! (%s)' % threading.currentThread())

loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
Hello world! (<_MainThread(MainThread, started 140735195337472)>)
Hello world! (<_MainThread(MainThread, started 140735195337472)>)
(暂停约1秒)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)

两个coroutine是由同一个线程并发执行的。

如果把asyncio.sleep()换成真正的IO操作,则多个coroutine就可以由一个线程并发执行。

意思是,在同一个线程中,使用多个协程,某个协助中的I/O操作耗时较长时,中断该线程中的该协程,转而去执行该线程中别的协程。从而在一个线程中,实现接近并发的操作,提示I/O密集型工作的效率。

小结:
asyncio提供了完善的异步IO支持;
异步操作需要在coroutine中通过yield from完成;通过yield from去调用另一个另一个generator;
多个coroutine可以封装成一组Task然后并发执行。

 类似资料: