Запустить две асинхронные функции, не блокируя друг друга - PullRequest
0 голосов
/ 12 октября 2018

У меня есть асинхронная функция, и я хочу запустить еще одну "параллельно".Но мне нужно сделать это в определенный момент внутри этой первой функции .

Я видел много примеров, но все они запускали две функции одновременно, иэто не то, что я хочу.

Я создал этот простой пример, чтобы проиллюстрировать, чего я хочу достичь (и что я пытался):

import asyncio
import time

async def print_letters():
    for letter in ['A', 'B', 'C', 'D']:
        print(letter)
        time.sleep(1)

async def print_numbers(loop):
    for number in range(1, 7):
        if(number == 3):
            # same result with create_task
            # loop.create_task(print_letters())
            asyncio.ensure_future(print_letters())
        print(number)
        time.sleep(1)

loop = asyncio.get_event_loop()
loop.run_until_complete(print_numbers(loop))
print('End')

Текущий вывод:

1, 2, 3, 4, 5, 6, A, B, C, D, End

Желаемый результат будет примерно таким:

1, 2, 3, A, 4, B, 5, C, 6 D, End

Я пробовал другие вещи (например, asyncio.wait), ноникто не работал, как ожидалось.Также документацию непросто понять, когда вы довольно новичок в Python asyncio.

Если вопрос неясен или что-то отсутствует, дайте мне знать, чтобы я мог его отредактировать.Я ценю любую помощь.

Python 3.6.2

1 Ответ

0 голосов
/ 12 октября 2018

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

import asyncio

async def print_letters():
    for letter in ['A', 'B', 'C', 'D']:
        print(letter)
        await asyncio.sleep(1)

async def print_numbers(loop):
    for number in range(1, 7):
        if(number == 3):
            # same result with create_task
            # loop.create_task(print_letters())
            asyncio.ensure_future(print_letters())
        print(number)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()
loop.run_until_complete(print_numbers(loop))
print('End')

Таким образом, все, что вам практически нужно сделать, это заменить time.sleep(...) на await asyncio.sleep(...).

...