Loading... > 背景 > > 我在写框架的时候发现异步事件循环async, 用List模拟任务队列时: > > 1. 如果队列里放的是协程对象,那么这个对象只能提交到event_loop一次, 否则会重复提交; > 2. 如果队列里放的是函数地址, 那么提交到event_loop时的create_task的参数把**函数地址传过去加括号**变为协程对象, 这一步骤实际上是创建的**协程副本** ``` # author: Michael # email: yangowen@126.com import asyncio import datetime async def coro(): await asyncio.sleep(1) print(f'task: {datetime.datetime.now()}') def run(): global loop_count, task_stack print(f'loop...{loop_count}') asyncio.get_event_loop().call_later(0, run) loop_count += 1 # 每次提交, 都会创建一个新的coro对象副本, 应该是用到了threading.local # asyncio.get_event_loop().create_task(coro()) # 只执行队列中的协程, 如果不pop, 记得: 不能执行相同的coro对象, 即队列中不能放协程对象, 要放函数地址 # 解释: # 队列中如果放coro(), 那么必须pop掉, 无法重复执行 # 队列中如果放coro 函数地址, 那么create_task时coro()为协程, 就不会重复 for index, coro in enumerate(task_stack): asyncio.get_event_loop().create_task(coro()) # task_stack.pop(index) if __name__ == '__main__': loop_count = 1 task_stack = [coro] run() asyncio.get_event_loop().run_forever() ``` © 允许规范转载