Stack Overflow на русском Asked by HTO HOT on November 20, 2021
Недавно начал изучать потоки в Python , конкретнее модуль threading.
И мне нужно сделать так чтобы после окончания потока , (то есть когда ввожу nameThrd.is_alive() оно выводит False) я мог бы запустить этот поток снова.
Весь код я не скинул потому , что сама программа на 200 символов , да ещё и с pyqt5.
Я делаю это так (уверен , что это не правильно):
def checkEvent():
global run
run = True
while run == True:
for x in range(0,5):
if (x == 5):
run = False
real_thrd()
def real_thrd () :
checkplay = threading.Thread(target=checkEvent)
checkplay.start()
#событие:
real_thrd()
###Код который нужно выполнить во время работы потока
#событие:
run = False
Как это будет правильно реализовать?
Python 3.8.3
Эту задачу можно решить не перезапуская поток. Например, перезапуск можно организовать через threading.Event зациклив run()
class Runner(threading.Thread):
def __init__(self, *a, **kw):
self.start_event = threading.Event()
super().__init__(*a, **kw)
def run(self):
while self.start_event.wait():
self.start_event.clear()
self._target(*self._args, **self._kwargs)
def restart(self):
self.start_event.set()
t = Runner(target=work)
t.start() # не начинает работу, ждет рестарт
t.restart() # запускает target
t.restart()
Answered by eri on November 20, 2021
multiprocessing.dummy модуль предоставляет интерфейс совместимый с multiprocessing, но для потоков, а не процессов.
Pool это группа процессов, соединенная очередбю заданий с основным кодом.
Для запуска функции в потоке несколько раз:
from multiprocessing.dummy import Pool
pool = Pool()
pool.apply_async(checkEvent)
Но скорее Вам нужен imap()
или map_async()
метод - сложно сказать без описания кода. Этот интерфейс очень удобен для выволнения не связанного с qt напрямую кода. Идеально для работы с сетью и файлами и прочим вводом-выводом. Для тяжолой обработки массивов данных лучше использовать пул процессов.
Для Qt также существуют родные QThread и соответсвенно к ним QThreadPool
На основной класс добавьте пул
self.threadpool = QThreadPool()
Функцию с полезной работтой надо обернуть в класс QRunnable
class Worker(QRunnable):
'''
Worker thread
'''
@pyqtSlot()
def run(self):
'''
Your code goes in this function
'''
print("Thread start")
time.sleep(5)
print("Thread complete")
И можно запускать несколько раз
worker = Worker()
self.threadpool.start(worker)
Очень подробная статья с примерами https://www.learnpyqt.com/courses/concurrent-execution/multithreading-pyqt-applications-qthreadpool/
Answered by eri on November 20, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP