подпроцесс vs asyncio для асинхронных запросов postgresql - PullRequest
0 голосов
/ 04 января 2019

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

Мне кажется, что одним из способов решения этой проблемы было бы использование модуля subprocess в Python для запуска сценариев bash, которые выполняют эти операции, используя что-то вроде subprocess.Popen. Я могу открыть много терминальных сессий и выполнять запросы параллельно, и, насколько я понимаю, этот подход имитирует это.

Чтобы взять пример из здесь :

from subprocess import Popen, PIPE
import glob

f_list = glob.glob('./*bz2')
cmds_list = [['./bunzip2_file.py', file_name] for file_name in f_list]
procs_list = [Popen(cmd, stdout=PIPE, stderr=PIPE) for cmd in cmds_list]
for proc in procs_list:
    proc.wait()

Мои вопросы:

  1. Есть ли очевидные проблемы с вызовом многих запросов postgres с использованием subprocess?

  2. При каких обстоятельствах я мог бы вместо этого рассмотреть использование asyncio? Предоставляет ли это какие-либо преимущества описанному выше методу?

1 Ответ

0 голосов
/ 06 января 2019

Обратите внимание, что asyncio сам по себе предназначен для управления потоком выполнения. Это означает, например, что вы можете гибко управлять подпроцессами, используя asyncio . Таким образом, ваш вопрос на самом деле об использовании процессов вместо асинхронного драйвера PostgreSQL.

Прежде всего вам, вероятно, не нужны процессы: если ваши bash-скрипты не содержат много вычислений, вы можете использовать потоки , они дешевле.

Когда дело доходит до asyncio по сравнению с потоками, оба решают основное узкое место производительности - сетевой ввод-вывод. Вероятно, вы не увидите никакой разницы в производительности, если не создадите тысячи потоков (см., Например, вопрос и ответ ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...