Как я могу отправить другой список задач после завершения одного списка задач в модуле asyncio? - PullRequest
1 голос
/ 25 марта 2019

Я новичок в модуле 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 Ответ

1 голос
/ 25 марта 2019

Несколько вещей, чтобы добавить,

  1. get_event_loop попытается получить доступ к любому доступному циклу событий, если его нет, он вызовет new_event_loop с set_event_loop, [Doc] .

  2. Просто используйте asyncio.gather, когда вы не будете выполнять какие-либо дальнейшие действия по отдельной задаче. Использование gather также дает вам возможность остановить всю группу задач, см. Этот SO ответ .

  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))
...