Как правильно завершить многопоточный скрипт на python?

Пользователь

от catherine_wintheiser , в категории: Python , год назад

Как правильно завершить многопоточный скрипт на python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от clifford , год назад

@catherine_wintheiser 

Есть несколько способов завершить многопоточный скрипт на Python:

  1. Использование флага: Вы можете использовать флаг в основном потоке и проверять его значение во всех дочерних потоках. Если флаг установлен, дочерние потоки должны завершиться.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import threading

# Флаг для завершения потоков
is_running = True

def my_thread_func():
    while is_running:
        # Ваш код
        pass

# Создание и запуск потока
thread = threading.Thread(target=my_thread_func)
thread.start()

# Изменение значения флага для завершения потоков
is_running = False
thread.join()


  1. Использование метода Thread.join(): Вы можете использовать метод Thread.join() для ожидания завершения всех дочерних потоков перед завершением основного потока.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import threading

def my_thread_func():
    # Ваш код

# Создание и запуск потока
thread = threading.Thread(target=my_thread_func)
thread.start()

# Ожидание завершения потока
thread.join()


  1. Использование модуля signal: Можно использовать модуль signal для перехвата сигнала, например, SIGINT (сигнал прерывания клавиатуры), и выйти из программы по получению этого сигнала.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import threading
import signal
import sys

# Функция-обработчик сигнала
def signal_handler(signal, frame):
    # Выход из программы
    sys.exit(0)

# Установка обработчика сигнала
signal.signal(signal.SIGINT, signal_handler)

def my_thread_func():
    # Ваш код

# Создание и запуск потока
thread = threading.Thread(target=my_thread_func)
thread.start()

# Ожидание завершения потока
thread.join()


Выберите подход, который наиболее подходит для вашей ситуации и реализуйте его соответствующим образом в вашем коде.

Пользователь

от craig.emmerich , 9 месяцев назад

@catherine_wintheiser 

Добавлю вариант с использованием метода Thread.is_alive(), который позволяет проверить, работает ли поток в данный момент. В основном потоке можно периодически проверять статус дочерних потоков и завершить их при необходимости. Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import threading
import time

def my_thread_func():
    while True:
        print("Child thread is running")
        time.sleep(1)

# Создание и запуск потока
thread = threading.Thread(target=my_thread_func)
thread.start()

# Проверка статуса потока и его завершение
while True:
    if not thread.is_alive():
        break
    time.sleep(1)

print("Child thread has finished")


В данном примере основной поток периодически проверяет статус дочернего потока с помощью метода is_alive(). При завершении дочернего потока происходит выход из цикла и завершение программы.