Как закрыть нить изнутри? - PullRequest
       39

Как закрыть нить изнутри?

41 голосов
/ 27 декабря 2010

Для каждого клиента, подключающегося к моему серверу, я создаю новый поток, например:

# Create a new client
c = Client(self.server.accept(), globQueue[globQueueIndex], globQueueIndex, serverQueue )

# Start it
c.start()

# And thread it
self.threads.append(c)

Теперь я знаю, что могу закрыть все темы, используя этот код:

    # Loop through all the threads and close (join) them
    for c in self.threads:
        c.join()

Но как я могу закрыть поток с внутри этого потока?

Ответы [ 4 ]

49 голосов
/ 27 декабря 2010

Когда вы запускаете поток, он начинает выполнять функцию, которую вы ему даете (если вы расширяете threading.Thread, функция будет run()). Чтобы завершить поток, просто вернитесь из этой функции.

В соответствии с this вы также можете вызвать thread.exit(), что вызовет исключение, которое завершит поток молча.

15 голосов
/ 29 апреля 2016

Немного поздно, но я использую переменную _is_running, чтобы сообщить потоку, когда я хочу закрыть.Это просто в использовании, просто реализуйте stop () внутри вашего класса потока.

def stop(self):
  self._is_running = False

И в run() просто зацикливайтесь на while(self._is_running)

6 голосов
/ 05 февраля 2018

Как насчет sys.exit() из модуля sys.

Если sys.exit() выполняется изнутри потока, он закроет только этот поток.

Этот ответ говорит об этом: Почему sys.exit () не завершается при вызовевнутри потока в Python?

1 голос
/ 03 октября 2016

Если вы хотите принудительно остановить вашу нить: thread._Thread_stop() Для меня это очень хорошо работает.

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