Это мой первый набег на резьбу, поэтому извиняюсь за любые очевидные ошибки.Проверка потокобезопасности в python?
У меня есть виджет PyQt, из которого новый процесс, prog, запускается в другом потоке. В моей основной теме я также перенаправляю stdout
только для чтения QTextEdit
. Тем не менее, я получаю ошибки, связанные с рекурсией, и я беспокоюсь, что мои потоки мешают друг другу так, что оператор печати переходит в бесконечный цикл. Я получаю только эти ошибки, если я запускаю prog из графического интерфейса пользователя, а не из командной строки. Мой stdout
редирект с помощью кода в this SO answer
В псевдо-коде, это в основном то, что я получил:
gui.py
class widget(QWidget):
def __init__(self):
self.button = QPushButton("GO!", self)
self.button.clicked.connect(self.start)
def start(self):
self.thread = TaskThread()
sys.stdout = EmittingStream(textWritten = self.outputText)
self.thread.start()
def outputText(self):
#as in answer provided in link (EmittingStream in separate module)
prog.py
class TaskThread(QThread):
def run(self):
'''
Long complicated program; putting in simpler code here (e.g. loop printing to 10000) doesn't reproduce errors
'''
- Есть ли способ узнать, вызвана ли моя рекурсия бесконечным циклом или чем-то еще?
- Является ли мой код явно небезопасным?
- Как вы гарантируете, что функции являются потокобезопасными? (Ссылки на учебные пособия/книги будут полезными!)
Моя первоначальная идея была неправильной, если вы хотите быть потокобезопасной, вам нужно отправить события из QThreads обратно в основной поток, используя QApplication.postEvent() (отлично в PyQt, утечка памяти в PySide) или использовать встроенные сигналы/slots QThreads и подключить слот из основного потока к сигналу в QThread (это соединение должно быть выполнено из основного потока или метода __init__ вашего QThread) (последний параметр сигнала/слота не пропускает память в PySide) Извинения за допущенные ошибки –