Несколько процессов в pyqt
Задача: Нужно написать приложение, которое открывает файлы пользователя, делает с ними некоторые операции, а затем перезаписывает их в другое место на диске.
Проблема: Работать с файлами нужно быстро, поэтому я хочу открывать их сразу в нескольких процессах, дабы избежать GIL. К сожалению, когда я пытаюсь создать несколько таких процессов в моем окне PyQt, окно пересоздается (вылетает, создает копии, переоткрывается, не закрывается и т.д.) и все данные из окна теряются. Хочется этого избежать и получить ускорение программы (при использовании QRunnable в однопоточном режиме все работает и очень даже хорошо).
А теперь коротко и по делу:
Есть функция:
def my_amazing_function(files, save_folder):
for file in files:
with open(file, 'r') as read_file:
my_text = read_file.read()
print(my_text)
with open(save_folder+'/'+file.split('/')[-1], 'w') as write_file: # <-- Открываем файл для сохранения
write_file.write(my_text)
Есть главное окно пользовательского интерфейса:
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *
from PyQt6.QtGui import *
import multiprocessing as mp
import sys
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.widget = QWidget(self)
self.button = QPushButton('Kill Me!', self.widget)
self.button.clicked.connect(start_processes)
self.files_for_each_process = [['Файлы для процесса 1'], ['Файлы для процесса 2'], ['Файлы для процесса 3']]
self.save_folder = 'Путь сохранения'
def start_processes(self):
self.workers = []
for files in self.files_for_each_process:
process = mp.Process(target=my_amazing_function, args=(files, self.save_folder))
self.workers.append(process)
process.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Гарантируется, что функция и главное окно работают правильно, в них багов не обнаружено. Проверено на однопоточном чтении-записи. Код, который приведен здесь на питоне запускается и даже не вылетает (Некорректные имена файлов?). При этом основной код (который я по причине величины здесь указывать не хочу) вылетает. Вопрос: что с этим делать и как поправить?
В проекте можно использовать многофайловую структуру и любые модули. Можно попробовать через QProcess, но тогда встает вопрос о передаче файлов. Я пытался работать с asyncio, но при вызове нового event_loop отдельно для процессов, программа все равно ломается.
Заранее спасибо за ответ!