Несколько процессов в pyqt

Рейтинг: 0Ответов: 0Опубликовано: 24.03.2023

Задача: Нужно написать приложение, которое открывает файлы пользователя, делает с ними некоторые операции, а затем перезаписывает их в другое место на диске.

Проблема: Работать с файлами нужно быстро, поэтому я хочу открывать их сразу в нескольких процессах, дабы избежать 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 отдельно для процессов, программа все равно ломается.

Заранее спасибо за ответ!

Ответы

Ответов пока нет.