Helpers - компьютеры, интернет, программирование

Перенаправление stdout в реальном времени с вызова функции python на асинхронный метод

Итак, у меня есть трудоемкий вызов функции my_heavy_function, и мне нужно перенаправить этот вывод в веб-интерфейс, который его вызывает, у меня есть метод для отправки сообщений в веб-интерфейс, давайте назовем этот метод async push_message_to_user().

в основном это что-то вроде

import time 

def my_heavy_function():
    time_on = 0 
    for i in range(20):
        time.sleep(1)
        print(f'time spend {time_on}')
        time_on = time_on+1

async def push_message_to_user(message:str):
    # some lib implementation 
    pass

if __name__ == "__main__":
    my_heavy_function() # how push prints to the UI ?
    

возможно, есть способ дать my_heavy_function(stdout_obj) и использовать этот std_object(StringIO) для выполнения чего-то вроде stdout_object.push(f'time spend {time_on}'). Я могу это сделать, но я не могу изменить my_heavy_function() на асинхронную версию, чтобы добавить push_message_to_user() напрямую вместо print (он используется другими неасинхронными подпрограммами)

то, что я хотел бы, это что-то вроде (псевдокод)

with contextlib.redirect_output(my_prints):
    my_heavy_function()
    while my_prints.readable():
        # realtime push
        await push_message_to_user(my_prints)

Спасибо!


  • Взгляните на janus, смешанную синхронно-асинхронную очередь. 29.04.2021
  • @HTF Я только что попробовал janus и работал, но только с тем же чтением/циклом, есть ли пример с неопределенным количеством сообщений? 29.04.2021

Ответы:


1

Спасибо за комментарий @HTF Мне наконец удалось решить проблему с janus. Я копирую пример репо и модифицирую, чтобы получать переменное количество сообщений (потому что я не знаю, сколько итераций будет использовать my_heavy_function())

import asyncio
import janus
import time 

def my_heavy_function(sync_q):
    for i in range(10):
        sync_q.put(i)
        time.sleep(1)
    sync_q.put('end')    # is there a more elegant way to do this ?
    sync_q.join()


async def async_coro(async_q):
    while True:
        val = await async_q.get()
        print(f'arrived {val}')
        # send val to UI 
        # await push_message_to_user(val)
        async_q.task_done()
        if val == 'end': 
            break

async def main():
    queue = janus.Queue()
    loop = asyncio.get_running_loop()
    fut = loop.run_in_executor(None, my_heavy_function, queue.sync_q)
    await async_coro(queue.async_q)
    await fut
    queue.close()
    await queue.wait_closed()


asyncio.run(main())
29.04.2021
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..