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

Тема: Python threading stopping threads: Как правильно остановить поток?

  1. Python threading stopping threads: Как правильно остановить поток?

    Здорова, ребята! Есть у меня одной замес с пайтоном. Я создал скрипт, где использую модуль threading. Всё бы ничего, но я не могу нормально остановить поток, и в итоге всё крашится. Кто-нибудь может объяснить, как грамотно грохнуть поток? Кидала кучу способов, но ни один не работает как надо. Может кодец какой покажете или перекинетесь идеями? Ваша помощь будет очень полезна!



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

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

  3. Йо, привет! Понять тя могу. С потоком и его остановкой в пайтоне действительно все не так просто. Чистого метода kill нету, но можно установить флаг, чтобы поток понел, что его надо завершать. Через Event, например. Вот как это выглядит:

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

    class ThreadWithFlag(threading.Thread):
        
    def __init__(self):
            
    threading.Thread.__init__(self)
            
    self._stop_event threading.Event()

        
    def run(self):
            while 
    not self._stop_event.is_set():
                print(
    'Работаю...')
                
    time.sleep(1)

        
    def stop(self):
            
    self._stop_event.set()

    ThreadWithFlag()
    t.start()
    time.sleep(5)
    t.stop()
    t.join() 

  4. Цитата Сообщение от AlexMoon
    Йо, привет! Понять тя могу. С потоком и его остановкой в пайтоне действительно все не так просто. Чистого метода kill нету, но можно установить флаг, чтобы поток понел, что его надо завершать. Через Event, например. Вот как это выглядит:

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

    class ThreadWithFlag(threading.Thread):
        
    def __init__(self):
            
    threading.Thread.__init__(self)
            
    self._stop_event threading.Event()

        
    def run(self):
            while 
    not self._stop_event.is_set():
                print(
    'Работаю...')
                
    time.sleep(1)

        
    def stop(self):
            
    self._stop_event.set()

    ThreadWithFlag()
    t.start()
    time.sleep(5)
    t.stop()
    t.join() 
    Эй, класно раскладено, бро! Четко с Event'ами, не подумал бы так. У тебя четко пашет?

  5. Ищи решение в аккуратной структуре кода. Можно ещё через queue провернуть.

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

    def worker
    (queue):
        while 
    True:
            try:
                
    item queue.get(timeout=1)
            
    except queue.Empty:
                continue
            if 
    item is None:
                break
            print(
    f'Работаю с {item}')

    queue.Queue()
    threading.Thread(target=workerargs=(q,))
    t.start()
    for 
    i in range(10):
        
    q.put(i)
    time.sleep(5)
    q.put(None)
    t.join() 

  6. Цитата Сообщение от Ася
    Ищи решение в аккуратной структуре кода. Можно ещё через queue провернуть.

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

    def worker
    (queue):
        while 
    True:
            try:
                
    item queue.get(timeout=1)
            
    except queue.Empty:
                continue
            if 
    item is None:
                break
            print(
    f'Работаю с {item}')

    queue.Queue()
    threading.Thread(target=workerargs=(q,))
    t.start()
    for 
    i in range(10):
        
    q.put(i)
    time.sleep(5)
    q.put(None)
    t.join() 
    Ну это ваще тема, через queue провернуть. Типа чисто данные передаешь и контроль тоже с ними?

  7. Здорово. Лучше избегать жестких остановок, используй вот этот метод.

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

    def worker
    (stop_event):
        while 
    not stop_event.is_set():
            print(
    'Работаем...')
            
    time.sleep(0.5)
        print(
    'Останавливаемся...')

    stop_event threading.Event()
    threading.Thread(target=workerargs=(stop_event,))
    t.start()
    time.sleep(3)
    stop_event.set()
    t.join() 

  8. Цитата Сообщение от porter
    Здорово. Лучше избегать жестких остановок, используй вот этот метод.

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

    def worker
    (stop_event):
        while 
    not stop_event.is_set():
            print(
    'Работаем...')
            
    time.sleep(0.5)
        print(
    'Останавливаемся...')

    stop_event threading.Event()
    threading.Thread(target=workerargs=(stop_event,))
    t.start()
    time.sleep(3)
    stop_event.set()
    t.join() 
    Красавчик, с flag-ом качают ваще по красоте!

  9. Йоу, братан, обрати внимание на глобальные переменные. Избегай их при остановке потоков. Threading в пайтоне — это не fast lane, будь аккуратен!

  10. Цитата Сообщение от Fantomex
    Йоу, братан, обрати внимание на глобальные переменные. Избегай их при остановке потоков. Threading в пайтоне — это не fast lane, будь аккуратен!
    Четко сказал, глобалки зло! Всё норм работает с флагами и event'ами. Code безопасен.

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