Как я могу запускать две функции одновременно, используя Asyncio в Python?

#python #python-3.x #asynchronous #async-await #python-asyncio

Вопрос:

 queue = []

async def funcA():
    r = random.randint(0, 1000)
    i = 0
    for i in range(10000000):
        pass
    print(r)
    queue.append(r)

    asyncio.create_task(funcb(r))

async def funcb(r):
    i = 0
    for i in range(100000000):
        pass
    print(r, "XX")
    queue.pop()


async def main():
    for i in range(10):
        await funcA()
    print(queue)


if __name__ == "__main__":
    asyncio.run(main())
 

Как мне сделать funcb() запуск одновременно? В этом коде funcb() выполняется только после выполнения всех вызовов funcA() . Я хочу funcB() работать одновременно с funcA() (в одних и тех же или разных потоках). Вот если funcA() бы бежал бесконечно, то funcB() никогда бы не бежал.

Комментарии:

1. Они оба блокируют функции, они ничего не дают/не ждут внутри. Даже если вы начнете их вместе, они могут быть выполнены только один за другим. Для параллельного выполнения вам нужна многопоточность.

2. Вы могли бы использовать run_in_executor , но, как говорят другие люди, это не то, что вы действительно хотите делать с asyncio

3. Не возражал бы получить от вас ответ и поставить галочку, если бы вы сочли мой ответ полезным.

Ответ №1:

Asyncio-это так называемый не упреждающий планировщик задач.

Это означает, что он не может переключаться между задачами самостоятельно, он требует, чтобы вызываемая им функция активно отказывалась (=уступала) приоритет.

Поскольку ваша функция не является асинхронной (= в ней нет команд, которые ждали бы чего-то с await ключевым словом), она просто выполняется до завершения, прежде чем вернуться к планировщику asyncio.

То, как вы описали свою проблему, звучит так, как будто она на самом деле не подходит для асинхронного программирования, но вместо этого требует многопоточности или даже многопроцессорной обработки (если вы хотите ускорить «одновременные» вычисления).