Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Как в Python threading остановить thread корректно?

  1. Как в Python threading остановить thread корректно?

    Йо, народ! Столкнулся с проблемой при работе с потоками в Python. Я юзаю `threading` модуль, и все работает ок, пока дело не доходит до остановки потока. Вроде все гуглил и даже stackoverflow шерстил, но решения не нашёл. Как вы корректно завершаете execution thread-а? Польщует ли кто-нибудь там `Thread.join()` или как по-умному заглушить бесконечный цикл в потоке? Кидоньте своими best practices и советами!



  2. Ждём вас в нашем чате в Телеграмм ==>> @pythoneer_chat

    А ТАКЖЕ: Канал о Python, статьи и книги ==>>
    @pythoneer_ru

  3. Лучший способ — внедрение флага остановки. Например:

    Программный код:
    import threading
    import time

    def worker
    (stop_flag):
     while not stop_flag.is_set():
      print('Работаем...')
      time.sleep(1)
     print('Поток остановлен!')

    stop_flag threading.Event()
    threading.Thread(target=workerargs=(stop_flag,))
    t.start()

    time.sleep(5)
    stop_flag.set()
    t.join() 
    Флагом (`Event`) можно корректно остановить поток. В этом случае не придется экстренно прерывать, да и сам поток завершится корректно.

  4. Цитата Сообщение от Тропа
    Лучший способ — внедрение флага остановки. Например:

    Программный код:
    import threading
    import time

    def worker
    (stop_flag):
     while not stop_flag.is_set():
      print('Работаем...')
      time.sleep(1)
     print('Поток остановлен!')

    stop_flag threading.Event()
    threading.Thread(target=workerargs=(stop_flag,))
    t.start()

    time.sleep(5)
    stop_flag.set()
    t.join() 
    Флагом (`Event`) можно корректно остановить поток. В этом случае не придется экстренно прерывать, да и сам поток завершится корректно.
    Кайф! Реально удобная штука! А что если поток зависнет и не успеет проверить флаг?

  5. Для корректного завершения потока также можно использовать `daemonic` потоки. Они завершатся автоматически, когда основной поток завершится:

    Программный код:
    import threading
    import time

    def worker
    ():
     while True:
      print('Работаем...')
      time.sleep(1)

    threading.Thread(target=worker)
    t.setDaemon(True)
    t.start()

    time.sleep(3)
    print(
    'Основной поток завершился'
    Но со всяким там ресурсом (файлы, сети) придется внимательнее.

  6. Цитата Сообщение от Dzo
    Для корректного завершения потока также можно использовать `daemonic` потоки. Они завершатся автоматически, когда основной поток завершится:

    Программный код:
    import threading
    import time

    def worker
    ():
     while True:
      print('Работаем...')
      time.sleep(1)

    threading.Thread(target=worker)
    t.setDaemon(True)
    t.start()

    time.sleep(3)
    print(
    'Основной поток завершился'
    Но со всяким там ресурсом (файлы, сети) придется внимательнее.
    Тру, братан, но `daemon` иногда может подставить. Пусть лучше код сам завершит работу.

  7. Еще вариант: использовать `Thread.join(timeout)`, но это не всегда выход. Например, если у вас длительные операции внутри потока, возможны кейсы, когда timeout не хватит:

    Программный код:
    import threading
    import time

    def worker
    ():
     time.sleep(10)

    threading.Thread(target=worker)
    t.start()

    t.join(timeout=5)
    if 
    t.is_alive():
     print('Поток еще работает, запускаем экстренное завершение...')
    else:
     print('Поток завершился сам'

  8. Цитата Сообщение от Drakol
    Еще вариант: использовать `Thread.join(timeout)`, но это не всегда выход. Например, если у вас длительные операции внутри потока, возможны кейсы, когда timeout не хватит:

    Программный код:
    import threading
    import time

    def worker
    ():
     time.sleep(10)

    threading.Thread(target=worker)
    t.start()

    t.join(timeout=5)
    if 
    t.is_alive():
     print('Поток еще работает, запускаем экстренное завершение...')
    else:
     print('Поток завершился сам'
    Познавательно, но че делать в случае экстренного завершения? Никогда не ясно, когда поток вспотевший будет работать.

  9. Если уж совсем emergencyю, то можно использовать `_thread` модуль. Только оч аккуратно!

    Программный код:
    import _thread
    import time

    def worker
    ():
     while True:
      print('Работаем...')
      time.sleep(1)

    threading.Thread(target=worker)
    t.start()

    time.sleep(3)
    _thread.interrupt_main() 
    Так делать не рекомендуется, но как наибыстрейший метод сработает.

  10. Цитата Сообщение от Daredevil
    Если уж совсем emergencyю, то можно использовать `_thread` модуль. Только оч аккуратно!

    Программный код:
    import _thread
    import time

    def worker
    ():
     while True:
      print('Работаем...')
      time.sleep(1)

    threading.Thread(target=worker)
    t.start()

    time.sleep(3)
    _thread.interrupt_main() 
    Так делать не рекомендуется, но как наибыстрейший метод сработает.
    Норм, для критических случаев годится! Но юзайте на свой страх и риск))

Страница 1 из 2 12 ПоследняяПоследняя