@beduin01

Как правильно использовать модуль multiprocessing с PostgreSQL?

В итоге под напором общественности решил отказаться от SQLite даже для хранения ссылок на файлы. Перенес все в PostgreSQL.

Добавление потоков в приложение толку не дало никакого. Как мне тут посоветовали я решил попробовать модуль multiprocessing чтобы разнести процессы по ядрам. Мой вод выглядит следующим образом:

def select_single_file_for_processing():
	#...
	sql = """UPDATE processing_files SET "isProcessing" = 'TRUE' WHERE "xml_name"='{0}'""".format(xml_name)
    cursor.execute(sql)
    conn.commit()  	

def worker():
    result = select_single_file_for_processing() # получаем файл для обработки    
    # ...
    # processing()

def main():
	# ....
    while unprocessed_xml_count != 0:

        checker_thread = threading.Thread(target=select_total_unpocessed_xml_count)
        checker_thread.start() # проверяем есть ли еще данные для обработки

        for i in range(10): # запускаем сами процессы
            t = Process(target=worker)
            t.start()


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

Как доступ к переменной: unprocessed_xml_count правильно организовать? А то у меня получается каждый процесс ее дергает и уверен она пишется не правильно

Я попробовал вообще очень тупорный вариант сделать. В БД у меня 1000 файлов. Без всяких синхронизаций сделал так:

for x in range(1000):
            for i in range(3):
                t = Process(target=worker)
                t.start()
                t.join()


Типа по три процесса стартовать. Но скорость тоже дико медленная стала.
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
решил отказаться от SQLite даже для хранения ссылок на файлы

А зачем?
sqlite отличная самая распространённая в мире база (см. android, firefox, chrome - sqlite всюду)
Слабо себе представляю sqlite в масштабе террабайта, а в масштабе пары мегабайт postgresql будет явный overkill.

Ну а по теме - я не питонщик и по приведённому коду мне совершенно неясно что же вы делаете. Профилируйте своё приложение, ищите где теряете время.
Ответ написан
@Fian
Каждый из процессов будет создавать подключение к БД. Создание подключения это относительно дорогая операция (из-за latency) и может занимать в этом случае больше, чем сами запросы. Также, создание нового процесса тоже дорогая операция. Но, честно говоря, без профилирования отвечать на данный вопрос — тыкать пальцем в небо.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы