基于协程的异步编程(Task)-3
TASK对象
task对象用于并发调度协程,实际上就是将任务添加到事件循环中等待这被执行。
可以使用asyncio.create_task()"3.7及以后版本",也可以使用loop.create_task()或者asyncio.ensure_future()。
例子1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
async def func(): print(1) await asyncio.sleep(2) print(2) return '返回值' async def main(): print('main run....') # 创建任务列表,相当于向时间循环中增加两个任务。这时事件循环已经创建。 # 加上main的协程函数本身,共3个任务在事件循环中 task_list = [ asyncio.create_task(func()), asyncio.create_task(func()) ] # 通过asyncio.wait(task_list) 等待这两个协程函数运行结束 # asyncio.wait() 有两个返回值 # 一个done 返回的是集合(运行结束的任务对象)正常运行结束的就会放到done的集合中 # 一个是pending(挂起的任务对象)asyncio.wait()第二个参数可以传递timeout,如果超过timeout就会到pending的集合中 # 默认是None代表无论多久都等他结束 done, pending = await asyncio.wait(task_list, timeout=None) print('done', done) print('pending', pending) asyncio.run(main()) |
例子2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
async def func(): print(1) await asyncio.sleep(2) print(2) return '返回值' # 简化省略main本身 # 不在这里创建task任务了 因为创建task实际是要将任务添加进事件循环,这时创建任务列表时还没有创建事件循环。 task_list = [ func(), func() ] # 通过syncio.wait() 会自己先创建事件循环,在将任务添加进去。 done, pending = asyncio.run(asyncio.wait(task_list, timeout=None)) print('done', done) print('pending', pending) |
未经允许不得转载:大师兄 » 基于协程的异步编程(Task)-3
评论已关闭