asyncio
事件循环是asyncio提供的核心运行机制
loop = asyncio.get_event_loop() # 获取一个事件循环(主线程才可以调用)
task = loop.create_task(task) # 创建一个任务
loop.run_until_complete(task) # 运行任务
开始一个协程
import asyncio
async def coroutine():
print('in coroutine')
event_loop = asyncio.get_event_loop()
try:
print('starting coroutine')
coro = coroutine()
print('entering event loop')
event_loop.run_until_complete(coro)
finally:
print('closing event loop')
event_loop.close()
从协程返回值
import asyncio
async def coroutine():
print('in coroutine')
return 'result'
event_loop = asyncio.get_event_loop()
try:
return_value = event_loop.run_until_complete(coroutine())
print('it returned: {}'.format(return_value))
finally:
event_loop.close()
第一步是获取事件的引用,可以使用默认的循环类型,或者可以实例化特定的循环类型。在这个例子中,用默认循环,
run_until_complete()方法使用coroutine对象启动循环,并在协同程序退出时停止循环
协程传参
一个协同程序可以启动另一个协同程序,并等待结果。 这使得更容易将任务分解成可重用的部分。 以下示例有两个阶段必须按顺序执行,但可以与其他操作同时运行。
import asyncio
async def outer():
print('in outer')
print('waiting for result1')
result1 = await phase1()
print('waiting for result2')
result2 = await phase2(result1)
return (result1, result2)
async def phase1():
print('in phase1')
return 'result1'
async def phase2(arg):
print('in phase2')
return 'result2 derived from {}'.format(arg)
event_loop = asyncio.get_event_loop()
try:
return_value = event_loop.run_until_complete(outer())
print('return_value:{}'.format(return_value))
finally:
event_loop.close()
下面这两个都是放个多个协程
asyncio.gather() # 有区别
asyncio.wait()
coros = [do_some_work(loop, 1), do_some_work(loop, 3)]
loop.run_until_complete(asyncio.wait(cors))
loop.run_until_complete(asyncio.gather(*cors))