在异步模块中完成一个任务列表后,如何提交另一个任务列表?

时间:2019-03-25 04:48:03

标签: python python-asyncio

我是异步模块的新手,请原谅我的恶意尝试:

在我的代码中,我尝试先提交100个任务,然后在前100个任务完成后提交下一个100个任务,然后再提交另外100个任务。

我应该怎么做才能使其正常工作?

# len(ad_accounts) = 1000 for example 
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
task_list = [
            asyncio.ensure_future(_handle_account(account)) for ad_account in ad_accounts[:100]
        ]
#just submit 100 tasks here once
new_loop.run_until_complete(asyncio.wait(task_list))
# then can I continuely submit next 100 tasks?

1 个答案:

答案 0 :(得分:1)

需要添加的东西

  1. get_event_loop将尝试访问任何可用的事件循环,如果没有,它将使用new_event_loop [Doc]来调用set_event_loop

  2. 当您不再执行任何单独的任务时,只需使用asyncio.gather。使用gather还为您提供了一种停止整个任务组的方法,请参阅此SO answer

  3. 您可能会在下面注意到,使用()生成器而不是[]列表推导,因为您不需要将列表实际保存在内存中,也不需要在迭代之前需要它。如果不是这种情况,请改回[]括号。

整个工作示例为:

# len(ad_accounts) = 1000 for example

chunk_size = 100
batched_tasks = (ad_accounts[i:i + chunk_size] for i in range(0, len(ad_accounts), chunk_size))
_loop = asyncio.get_event_loop()

for task_group in batched_tasks:
    task_list = [
        asyncio.ensure_future(_handle_account(account)) for ad_account in task_group
    ]
    #just submit 100 tasks here once
    _loop.run_until_complete(asyncio.gather(*task_list))
    # Or _loop.run_until_complete(asyncio.wait(task_list))