异步I/O和多线程都是解决并发的方法,但它们有很大的区别。asyncio主要是依靠一个消息循环来实现异步I/O,而线程是操作系统提供的原生并发模型。下面是一个简单的示例程序来说明它们的不同:
使用线程实现并发:
import threading
def worker():
print("Worker")
return
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
使用asyncio实现并发:
import asyncio
async def worker():
print("Worker")
return
async def main():
tasks = []
for i in range(5):
task = asyncio.ensure_future(worker())
tasks.append(task)
await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
从代码中可以看出,使用线程需要手动创建和管理线程,而使用asyncio可以通过一系列的协程来实现并发。此外,在异步I/O中,当一个协程遇到I/O操作时会自动挂起,而线程需要主动进行阻塞等待。