Python3: как остановить / убить поток - PullRequest
0 голосов
/ 01 ноября 2019

Мой код запускает N потоков. Я хочу остановить определенные потоки при некоторых условиях, но остальные потоки должны продолжать работать. Я делаю некоторые операции, как только каждый поток завершает свою работу. Есть ли способ остановить запуск потока в Python 3.

Мой текущий код реализован в Python2, который делает это с помощью "_Thread__stop ()". Есть ли идентичные вещи в Python3?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Плохая привычка - убивать поток, лучше создать «флаг», который сообщит вам, когда ваш поток завершил свою работу. Рассмотрим следующий пример:

import threading
import random

class CheckSomething(threading.Thread):
    def __init__(self, variable):
        super(CheckSomething, self).__init__()
        self.start_flag = threading.Event()
        self.variable = variable

    def check_position(self, variable):
        x = random.randint(100)
        if variable == x:
            self.stop_checking()

    def run(self):
        while True:
            self.check_position(self.variable) 

    def stop_checking():
        self.start_flag.set()

    def stopped():
        return self.start_flag.is_set()

Метод Event () set () устанавливает свой статус в True. Больше вы можете прочитать в документации: https://docs.python.org/3.5/library/threading.html

Поэтому вам нужно вызывать stop_checking (), когда вы встречаете условие, при котором вы хотите выйти.

0 голосов
/ 01 ноября 2019

Практика состоит в том, чтобы "сигнализировать" потоку, что пора заканчивать, а затем поток должен выйти. Это не убийство, как если бы вы убивали процесс, а обычное поведение конечного автомата вашей функции потока.

Например, предположим, что ваш поток блокируется. Вы должны вставить оператор if внутри цикла, который инструктирует функции потока: break или return if stop is True. Переменная stop должна быть общей переменной с основным потоком (или потоком, которому необходимо остановить поток), который изменит ее на True. обычно после этого стопорный поток захочет дождаться завершения потока на join()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...