TransWikia.com

Python. Можно ли запустить один поток много раз?

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

2 Answers

Эту задачу можно решить не перезапуская поток. Например, перезапуск можно организовать через 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP