@Rudtoha

Как заставить event loop выполнять одну и ту же задачу бесконечно?

Здравствуйте, только начал разбираться с модулем Asyncio, и возникла проблема: есть определенная асинхронная функция, которая что-то делает. Заворачиваю ее в с помощью create_task и отправляю в event loop. Но задача выполняется только один раз, несмотря на то что циклу задаю параметр run_forever.
Для наглядности код:
import asyncio
import time

async def S():
    t = time.time()
    i = 0
    while time.time() - t < 5:
        i += 1
    print("done")

loop = asyncio.get_event_loop()
loop.create_task(S())
loop.run_forever()
loop.close()

Заранее спасибо
  • Вопрос задан
  • 572 просмотра
Решения вопроса 1
adugin
@adugin Куратор тега Python
У вас нет функции, которая требует ожидания ввода-вывода, поэтому asyncio не нужен. Но вот примерный шаблон:
import asyncio
from contextlib import closing

async def get_some_data():
    # Обработка I/O - например, получение данных через HTTP
    await asyncio.sleep(2)
    data = 'ping'
    print(data)
    return data 

async def process(data):
    # Обработка данных на CPU
    await asyncio.sleep(1)    
    print('pong')

async def main():
    while True:
        data = await get_some_data()  # Блокирующий вызов - ожидание поступления новой порции данных
        asyncio.ensure_future(process(data))  # Неблокирующий вызов - обработка данных на CPU
    
if __name__ == "__main__":

    with closing(asyncio.get_event_loop()) as event_loop:
        event_loop.run_until_complete(main())

Также посмотрите здесь: При как обстоятельствах закрывается потом в Python?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DarkMode
@DarkMode
Made out of meat.
import asyncio
import time

async def S():
    t = time.time()
    i = 0
    while time.time() - t < 1:
        i += 1
        loop.create_task(S())
    print("done")
loop = asyncio.get_event_loop()
cors = asyncio.wait([S()])
loop.run_until_complete(cors)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 22:26
3500 руб./за проект
22 нояб. 2024, в 21:47
3000 руб./за проект
22 нояб. 2024, в 21:44
50000 руб./за проект