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

Тема: Как в python threading корректно stop threads? Поделитесь опытом!

  1. Как в python threading корректно stop threads? Поделитесь опытом!

    Привет, кодеры! Столкнулся с такой темой: у меня есть Python скрипт, который использует threading для запуска нескольких потоков. Вот только вопрос - как корректно останавливать эти потоки? Не хочу прибегать к kill, так как это вызывает побочные эффекты. Гуглил, но там инфы куча, а толком ничего не понятно. Кто что практикует, как вы это делаете и почему? Буду рад примерам кода и советам!



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

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

  3. Здорово! У меня была похожая заморочка. Самое удобное, что я использую, это флаги. Примерно вот так:

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

    import threading

    import time



    stop_threads 
    False



    def worker
    ():

        while 
    not stop_threads:

            print(
    'Working...')

            
    time.sleep(1)



    thread threading.Thread(target=worker)

    thread.start()



    time.sleep(5)

    stop_threads True

    thread
    .join()

    print(
    'Thread stopped'
    В общем, ставишь флаг, проверяешь его в цикле и аккуратно останавливаешь поток. Готово без побочных эффектов!

  4. Цитата Сообщение от DonJuan
    Здорово! У меня была похожая заморочка. Самое удобное, что я использую, это флаги. Примерно вот так:

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

    import threading

    import time



    stop_threads 
    False



    def worker
    ():

        while 
    not stop_threads:

            print(
    'Working...')

            
    time.sleep(1)



    thread threading.Thread(target=worker)

    thread.start()



    time.sleep(5)

    stop_threads True

    thread
    .join()

    print(
    'Thread stopped'
    В общем, ставишь флаг, проверяешь его в цикле и аккуратно останавливаешь поток. Готово без побочных эффектов!
    Йо! То, что нужно. Флаги - топчик, сам так пользуюсь. Хотя б не надо в каждую функцию костыли вставлять.

  5. Привет! Можно ещё использовать threading.Event. Очень удобно и читаемо:

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

    import threading



    stop_event 
    threading.Event()



    def worker():

        while 
    not stop_event.is_set():

            print(
    'Working...')

            
    time.sleep(1)



    thread threading.Thread(target=worker)

    thread.start()



    time.sleep(5)

    stop_event.set()

    thread.join()

    print(
    'Thread stopped'
    Событие проверяется в цикле, всё чисто и понятно.

  6. Цитата Сообщение от Раиса
    Привет! Можно ещё использовать threading.Event. Очень удобно и читаемо:

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

    import threading



    stop_event 
    threading.Event()



    def worker():

        while 
    not stop_event.is_set():

            print(
    'Working...')

            
    time.sleep(1)



    thread threading.Thread(target=worker)

    thread.start()



    time.sleep(5)

    stop_event.set()

    thread.join()

    print(
    'Thread stopped'
    Событие проверяется в цикле, всё чисто и понятно.
    Ооо, event - это хорошо! Более лаконично получается, чем с флагом. Надо попробовать.

  7. Привет! Я когда-то делал через sub-thread класс свой:

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

    import threading

    import time



    class MyThread(threading.Thread):

        
    def __init__(self):

            
    super().__init__()

            
    self._stop_event threading.Event()

        

        
    def run(self):

            while 
    not self._stop_event.is_set():

                print(
    'Working...')

                
    time.sleep(1)

        

        
    def stop(self):

            
    self._stop_event.set()



    thread MyThread()

    thread.start()



    time.sleep(5)

    thread.stop()

    thread.join()

    print(
    'Thread stopped'
    Как вид, можно класс свой писать. Очень гибко под моборий таск.

  8. Цитата Сообщение от Андрей Александрович
    Привет! Я когда-то делал через sub-thread класс свой:

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

    import threading

    import time



    class MyThread(threading.Thread):

        
    def __init__(self):

            
    super().__init__()

            
    self._stop_event threading.Event()

        

        
    def run(self):

            while 
    not self._stop_event.is_set():

                print(
    'Working...')

                
    time.sleep(1)

        

        
    def stop(self):

            
    self._stop_event.set()



    thread MyThread()

    thread.start()



    time.sleep(5)

    thread.stop()

    thread.join()

    print(
    'Thread stopped'
    Как вид, можно класс свой писать. Очень гибко под моборий таск.
    Ну это прям хардкор! Свой класс, своя тема. Полный контроль над потоком! Надо глянуть.

  9. Эй, недавно нашёл ещё один способ. Можно использовать concurrent.futures:

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

    from concurrent
    .futures import ThreadPoolExecutor

    import time



    def worker
    (stop_event):

        while 
    not stop_event.is_set():

            print(
    'Working...')

            
    time.sleep(1)



    stop_event threading.Event()

    with ThreadPoolExecutor(max_workers=1) as executor:

        
    future executor.submit(workerstop_event)

        
    time.sleep(5)

        
    stop_event.set()

        
    future.result()

    print(
    'Thread stopped'
    Через executor управлять потоками - вообще огонь, легко масштабируется.

  10. Цитата Сообщение от Юлия
    Эй, недавно нашёл ещё один способ. Можно использовать concurrent.futures:

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

    from concurrent
    .futures import ThreadPoolExecutor

    import time



    def worker
    (stop_event):

        while 
    not stop_event.is_set():

            print(
    'Working...')

            
    time.sleep(1)



    stop_event threading.Event()

    with ThreadPoolExecutor(max_workers=1) as executor:

        
    future executor.submit(workerstop_event)

        
    time.sleep(5)

        
    stop_event.set()

        
    future.result()

    print(
    'Thread stopped'
    Через executor управлять потоками - вообще огонь, легко масштабируется.
    Ага, либ concurrent.futures тоже огонь. Особенно в больших проектах, когда много потоков! Точно, бери в оборот.

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