В итоге под напором общественности решил отказаться от 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()
Типа по три процесса стартовать. Но скорость тоже дико медленная стала.