При запуске кода выдает ошибку EOFError: Ran out of input

По задумке при нажатии кнопки start должен запускаться поток, выполняющий определенный цикл, а кнопка end соответственно этот поток останавливает.

Поправьте, пожалуйста, если что-то не так делаю. В многопоточности новичок. Использую встроенную библиотеку multipocessing.

Полный traceback ошибки:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Bubunduc\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "C:\Users\Bubunduc\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 126, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

Фрагмент кода:

 def add_functionts(self):
        self.btn_start.clicked.connect(self.Process)
        self.btn_end.clicked.connect(self.end)

 def Process(self):
     self.process= multiprocessing.Process(target=self.start)
     self.process.start()

 def start(self):
    print('start')
    while True:
        time.sleep(2)
        print('Hi')
 def end(self):
    print('The end of the programm')
    self.process.terminate()

Ответы (1 шт):

Автор решения: S. Nick

В Qt достаточно собственных средств для работы с потоками и редко когда вам понадобятся сторонние библиотеки.

Самый простой вариант - это использовать класс QThread.

Класс QThread обеспечивает независимый от платформы способ управления потоками.

import sys
from PyQt5.Qt import *


class Thread(QThread):
    signal = pyqtSignal(str)
    
    def __init__(self):
        super().__init__()
        self.flag = True
        self.i = 1
        
    def run(self):
        while self.flag:
            self.signal.emit(f'Hi {self.i}')
            self.msleep(2000)
            self.i += 1

    def stop(self): 
        self.flag = False
    

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()  

        self.textEdit = QTextEdit()        
        self.btn = QPushButton('Start')
        self.btn.clicked.connect(self.onClicked)
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.textEdit)
        layout.addWidget(self.btn)

        self.thread = Thread()
        self.thread.signal.connect(self.updateData)

    def updateData(self, text):
        self.textEdit.append(text)

    def onClicked(self):
        if self.btn.text() == 'Start': 
            self.thread.flag = True
            self.thread.start()        
            self.btn.setText('Stop')
        else:
            self.thread.flag = False
            self.btn.setText('Start')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 300)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка