Сопрограмма и асин c / жду - PullRequest
       34

Сопрограмма и асин c / жду

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

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

Я упростил задачу в этом фрагменте:

import time
import asyncio


async def long_task():
    time.sleep(3)
    return "DONE !"


def do_while_idle():
    loop = asyncio.get_event_loop()
    task = loop.create_task(long_task)
    while not task.done():
        time.sleep(1)
        print("IDLE")
    print(task.result())


do_while_idle()

Я хотел бы получить такой вывод:

IDLE
IDLE
IDLE
DONE !

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Как указывает MisterMiyagi , вы должны дождаться asyncio.sleep() вместо вызова time.sleep(), а также устранить другие блокировки, например, заменив использование requests на aiohttp .

Чтобы выполнить некоторый код простоя в течение всего времени выполнения задачи, вы можете написать код простоя как бесконечный l oop, независимо от основной задачи. do_while_idle может запустить простое l oop как задачу, непосредственно ждать long_task(), а затем просто отменить простое:

import asyncio

async def long_task():
    await asyncio.sleep(3)
    return "DONE !"

async def idle():
    while True:
        await asyncio.sleep(1)
        print("IDLE")

async def do_while_idle():
    idle_task = asyncio.create_task(idle())
    print(await long_task())
    idle_task.cancel()

asyncio.run(do_while_idle())
1 голос
/ 28 апреля 2020

Вы можете подойти к этому следующим образом:

import asyncio

async def do_while_idle():
    for _ in range(3):
        print("IDLE")
        await asyncio.sleep(1)

    return "Done stuff while idling"

async def long_task():
    await asyncio.sleep(3)
    return "DONE !"

async def main():
    task = asyncio.create_task(long_task())
    task2 = asyncio.create_task(do_while_idle())
    done, _ = await asyncio.wait({task, task2})

    if task in done:
        task2.cancel()
        print(task.result())

asyncio.run(main())

Еще одна задача должна быть на холостом ходу, этот фрагмент ожидает завершения задания long_task и отменяет задачу на холостом ходу. Вы также можете проверить, завершен ли режим холостого хода и long_task следующим образом:

async def main():
    task = asyncio.create_task(long_task())
    task2 = asyncio.create_task(do_while_idle())
    done, _ = await asyncio.wait({task, task2})

    if task and task2 in done:
        print(task.result(), task2.result())

Первый фрагмент кода даст вам желаемый результат:

IDLE
IDLE
IDLE
DONE !
...