Как распараллелить длительные операции ввода-вывода в многопоточном приложении Python с помощью asyncio?Python

Программы на Python
Ответить
Anonymous
 Как распараллелить длительные операции ввода-вывода в многопоточном приложении Python с помощью asyncio?

Сообщение Anonymous »

Я создаю приложение Python, которое использует цикл событий (через библиотеку asyncio) для прослушивания тиковых данных от обмена криптовалютой через WebSocket. Тиковые данные поступают для различных символов, и я помещаю эти тики в очередь. Queue (которая является потокобезопасной, но не асинхронно-совместимой).
Отдельный поток TickProcessor, обрабатывает тики из очереди и принимает решения о том, необходимо ли выполнять дорогостоящие операции ввода-вывода (например, запросы к базе данных, записи или вызовы REST API). В настоящее время эти операции ввода-вывода выполняются синхронно в рабочем потоке, что приводит к значительным задержкам в обработке тиковых данных из-за блокировки вызовов ввода-вывода.
Я хотел бы распараллелить операции ввода-вывода. чтобы уменьшить эту задержку и улучшить общую производительность. Я подумал о двух потенциальных решениях, но не уверен, какое из них будет наиболее эффективным с точки зрения использования ресурсов. Вот варианты, которые я рассматриваю:
Использовать основной цикл событий. Идея состоит в том, чтобы использовать основной цикл событий (который обрабатывает тики WebSocket) для выполнения дорогостоящих операций ввода-вывода. В этой настройке поток обработки больше не будет выполнять задачи ввода-вывода напрямую, а вернется в цикл событий, который будет обрабатывать операции ввода-вывода асинхронно.
Запустите отдельный поток с собственным циклом событий. : Другой вариант — создать новый поток, который запустит новый цикл событий для асинхронной обработки операций ввода-вывода с использованием asyncio. Таким образом, у меня фактически будет три потока: один для получения тиковых данных, один для обработки и один с циклом событий, выполняющим асинхронные операции ввода-вывода.
Основные ограничения:
Я не хочу проводить рефакторинг всего приложения, чтобы сделать его полностью асинхронным, поскольку это было бы слишком дорого и отнимало бы много времени. У меня есть работающий синхронный код, который должен выполняться по порядку и который нелегко изменить. Я не возражаю, если определенные задачи (например, операции ввода-вывода) ожидают в другом потоке, в то время как выполнение продолжается в основном потоке и потоке обработки.
Какой подход будет более ресурсоэффективным, и каковы его преимущества и недостатки? каждый? Есть ли другое лучшее решение, которое мне может не хватать?

Подробнее здесь: https://stackoverflow.com/questions/791 ... on-applica
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»