Python asyncio - Как создать список задач и использовать его в событии l oop? - PullRequest
0 голосов
/ 02 апреля 2020

Я не очень опытен в Python asyncio, хотя синхронный Python идет хорошо. У меня есть функция, которая создает список задач, и другая функция, которая должна вызываться с задачами в этом списке:

import asyncio

async def createTasks(some_dict):
    coroutines = []
    # some_dict can have an arbitrary number of items
    for item in some_dict:
        coroutines.append(executeOneTask(item))
    tasks = await asyncio.gather(*coroutines, return_exceptions=True)
    return tasks

async def executeOneTask(item):
    # execute a task asynchronously
    return

Здесь вы можете исправить меня, если я ошибаюсь.

Теперь я понимаю, что asyncio мне нужно событие l oop для выполнения асинхронной функции, что означает, что для asyncio.gather мне нужно await это, что означает, что это должно происходить внутри async функция. Итак, мне нужно событие l oop для создания моего списка асинхронных задач, которые я действительно хочу выполнять асинхронно.

Если мое понимание циклов событий верно, я не могу легко добавить задачи внутри события l oop к тому же событию l oop. Давайте предположим, что у меня есть асинхронная функция main(), которая должна сначала получить список асинхронных задач, используя createTasks(), а затем создать сумму (равную list длина) асинхронные задачи, выполняемые с использованием executeOneTask().

Как мне подойти к построению такой main() функции? Мне нужно несколько циклов событий? Могу ли я создать список задач другим способом, который позволяет упростить код?

Примечание: выбранный мной подход может быть очень сложным или перевернутым способом решения проблемы. Я хочу создать список асинхронных задач и затем выполнить их асинхронно. Не стесняйтесь не следовать приведенной выше структуре кода, если интеллектуальное решение требует этого.

Спасибо!

1 Ответ

0 голосов
/ 02 апреля 2020

Вы должны использовать только одно событие l oop во всем приложении. Запустите основную функцию с помощью asyncio.run(main()), и asyncio создаст для вас al oop. С Python 3.8 вам редко требуется прямой доступ к l oop или его использование, но в более старых версиях вы можете получить его asyncio.get_event_loop(), если используете методы l oop или некоторые функции, требующие аргумента l oop.

Обратите внимание, что I Python (используется в Spyder и Jupyter) также запускает свой собственный l oop, поэтому в них вы можете напрямую звонить и await без вызова asyncio.run.

Если вам нужно только wi sh для асинхронного c программирования, но вам не нужно специально работать с asyncio, я бы порекомендовал проверить https://trio.readthedocs.io/, который в основном делает то же самое, но гораздо, очень проще в использовании (правильно).

...