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

Тема: Помощь с проблемой: python thread stops

  1. Помощь с проблемой: python thread stops

    Ребята, привет! Столкнулся с такой проблемой: запустил поток в питоне, но он внезапно останавливается без ошибок и предупреждений. Кто-то сталкивался с подобным?? Может есть идеи, почему python thread stops? Дайте совет, плиз!



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

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

  3. Привет! Такое бывает, когда в коде возникают необработанные исключения. Они могут быть не видны сразу, так как происходят внутри потока.
    Попробуй обернуть код в `try`-`except`. Например:
    Программный код:
    import threading

    import time


    def thread_function
    (name):

        try:

            print(
    f'Thread {name}: starting')

            
    time.sleep(2)

            
    raise Exception('Это тестовая ошибка')

            print(
    f'Thread {name}: finishing')

        
    except Exception as e:

            print(
    f'Thread {name}: ошибка - {e}')


    thread threading.Thread(target=thread_functionargs=(1,))

    thread.start()

    thread.join() 
    Если в потоке вылетает ошибка, то ты сразу увидишь её и так сможешь понять, что и где пошло не так.

  4. Цитата Сообщение от Солнце
    Привет! Такое бывает, когда в коде возникают необработанные исключения. Они могут быть не видны сразу, так как происходят внутри потока.
    Попробуй обернуть код в `try`-`except`. Например:
    Программный код:
    import threading

    import time


    def thread_function
    (name):

        try:

            print(
    f'Thread {name}: starting')

            
    time.sleep(2)

            
    raise Exception('Это тестовая ошибка')

            print(
    f'Thread {name}: finishing')

        
    except Exception as e:

            print(
    f'Thread {name}: ошибка - {e}')


    thread threading.Thread(target=thread_functionargs=(1,))

    thread.start()

    thread.join() 
    Если в потоке вылетает ошибка, то ты сразу увидишь её и так сможешь понять, что и где пошло не так.
    Да, try-except сильно помогает в таких ситуациях. Чаще всего именно непойманные исключения роняют потоки.

  5. Ещё причиной может быть недостаток памяти или другие ресурсы системы. Проверь, сколько ресурсов съедают твои потоки.
    Используй такие библиотеки как `psutil`, чтобы мониторить использование памяти и CPU.

  6. Цитата Сообщение от Гефест
    Ещё причиной может быть недостаток памяти или другие ресурсы системы. Проверь, сколько ресурсов съедают твои потоки.
    Используй такие библиотеки как `psutil`, чтобы мониторить использование памяти и CPU.
    Тема с ресурсами актуальна. У меня была подобная проблема из-за того, что оперативка кончилась пока поток работал.

  7. Также, иногда помогает использование `daemon=True` в определении потока, если тебе не важно завершение потока после завершения основного процесса. Поток с таким параметром автоматически завершится, когда завершится главный поток:
    Программный код:
    thread threading.Thread(target=thread_functionargs=(1,), daemon=True

  8. Цитата Сообщение от FutureRider222
    Также, иногда помогает использование `daemon=True` в определении потока, если тебе не важно завершение потока после завершения основного процесса. Поток с таким параметром автоматически завершится, когда завершится главный поток:
    Программный код:
    thread threading.Thread(target=thread_functionargs=(1,), daemon=True
    daemon=True интересная опция, но она не всегда помогает. Только если мелькает быстро завершить процесс целиком.

  9. Есть ещё вариант с неправильным использованием глобальных переменных. Иногда синхронизация между потоками через глобальные переменные вызывает такие проблемы. Используй `threading.Lock` для безопасного доступа к общим ресурсам между потоками:
    Программный код:
    import threading


    lock 
    threading.Lock()

    count 0


    def safe_increment
    ():

        global 
    count

        with lock
    :

            
    count += 1


    threads 
    = [threading.Thread(target=safe_increment) for _ in range(10)]


    for 
    thread in threads:

        
    thread.start()


    for 
    thread in threads:

        
    thread.join()


    print(
    count

  10. Цитата Сообщение от SoulTraveler625
    Есть ещё вариант с неправильным использованием глобальных переменных. Иногда синхронизация между потоками через глобальные переменные вызывает такие проблемы. Используй `threading.Lock` для безопасного доступа к общим ресурсам между потоками:
    Программный код:
    import threading


    lock 
    threading.Lock()

    count 0


    def safe_increment
    ():

        global 
    count

        with lock
    :

            
    count += 1


    threads 
    = [threading.Thread(target=safe_increment) for _ in range(10)]


    for 
    thread in threads:

        
    thread.start()


    for 
    thread in threads:

        
    thread.join()


    print(
    count
    Глобалки - это частая ловушка. Всегда лучше использовать блокировки, когда несколько потоков используют одни и те же данные.

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