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

Тема: Помогите разобраться с python threading thread queue, срочно надо!

  1. Помогите разобраться с python threading thread queue, срочно надо!

    Всем привет! Нужна помощь с многопоточной программой на Python. Пытаюсь использовать threading и queue, но что-то идет не так. Создаю потоки, кидаю задачи в очередь, но они работают не так, как я ожидал. Кому не лень, гляньте на мой пример кода и подскажите, что я упускаю:

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

          import threading

          import queue

          

          def worker
    (q):

              while 
    True:

                  
    task q.get()

                  if 
    task is None:

                      break

                  print(
    "Работаем над:"task)

                  
    q.task_done()

          

          
    task_queue queue.Queue()

          

          
    threads = []

          for 
    i in range(4):

              
    threading.Thread(target=workerargs=(task_queue,))

              
    t.start()

              
    threads.append(t)

          

          for 
    task in range(10):

              
    task_queue.put(task)

          

          
    task_queue.join()

          

          for 
    i in range(4):

              
    task_queue.put(None)

          for 
    t in threads:

              
    t.join() 


    Друзья, в чем может быть дело? Почему мой код странно себя ведет?



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

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

  3. Здорово! На первый взгляд, твой код выглядит норм, но можно немного улучшить. Например, ты правильно использовал join() для ожидания завершения задач, но проблема может быть в неправильной синхронизации потоков. Попробуй использовать условные переменные или Lock объекты для лучшей синхронизации.

  4. Цитата Сообщение от Vadim123
    Здорово! На первый взгляд, твой код выглядит норм, но можно немного улучшить. Например, ты правильно использовал join() для ожидания завершения задач, но проблема может быть в неправильной синхронизации потоков. Попробуй использовать условные переменные или Lock объекты для лучшей синхронизации.
    Крутая идея с Lock! Надо будет попробовать, вдруг решит проблему.

  5. Йо! Тут все вроде нормалек, но тебе лучше явно обрабатывать случаи, когда очередь пуста. Используй q.empty() или добавь таймаут при получении задачи q.get(timeout=1). Иногда потоки просто ждут, если очередь пуста. Надеюсь, это испавит трабл.

  6. Цитата Сообщение от DragonSpirit007
    Йо! Тут все вроде нормалек, но тебе лучше явно обрабатывать случаи, когда очередь пуста. Используй q.empty() или добавь таймаут при получении задачи q.get(timeout=1). Иногда потоки просто ждут, если очередь пуста. Надеюсь, это испавит трабл.
    Да, про таймаут я не подумал, тогда бы потоки не зависали один-на-один. Спасибо за идею!

  7. Эй, коллега! Мне кажется, твои потоки лагают из-за того, что слишком много задач поступает одновременно. Подумай использовать ThreadPoolExecutor из concurrent.futures, он проще в использовании и может уменьшить твои боли. Интерфейс у него гораздо удобнее и короче.

  8. Цитата Сообщение от Galactus
    Эй, коллега! Мне кажется, твои потоки лагают из-за того, что слишком много задач поступает одновременно. Подумай использовать ThreadPoolExecutor из concurrent.futures, он проще в использовании и может уменьшить твои боли. Интерфейс у него гораздо удобнее и короче.
    Ага, возможно, ThreadPoolExecutor как раз мне и нужен. Спасибо за наводку!

  9. Привет! Посмотрел твой код и у меня мысли такие: попробуй добавить более детальный logging, чтобы понять в какие моменты возникают проблемы. Это поможет отловить редкие баги или узнать, есть ли вообще проблема с потоками. Иногда простое логирование творит чудеса.

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

    import threading

    import queue

    import logging



    logging
    .basicConfig(level=logging.DEBUGformat="%(threadName)s: %(message)s")



    def worker(q):

        while 
    True:

            
    task q.get()

            if 
    task is None:

                break

            
    logging.debug(f'Работаем над: {task}')

            
    q.task_done()



    task_queue queue.Queue()



    threads = []

    for 
    i in range(4):

        
    threading.Thread(target=workerargs=(task_queue,))

        
    t.start()

        
    threads.append(t)



    for 
    task in range(10):

        
    task_queue.put(task)



    task_queue.join()



    for 
    i in range(4):

        
    task_queue.put(None)

    for 
    t in threads:

        
    t.join() 


    Может это прояснит пару моментов. Чекни и отпишись, что получилось.

  10. Цитата Сообщение от Петр Сергеевич
    Привет! Посмотрел твой код и у меня мысли такие: попробуй добавить более детальный logging, чтобы понять в какие моменты возникают проблемы. Это поможет отловить редкие баги или узнать, есть ли вообще проблема с потоками. Иногда простое логирование творит чудеса.

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

    import threading

    import queue

    import logging



    logging
    .basicConfig(level=logging.DEBUGformat="%(threadName)s: %(message)s")



    def worker(q):

        while 
    True:

            
    task q.get()

            if 
    task is None:

                break

            
    logging.debug(f'Работаем над: {task}')

            
    q.task_done()



    task_queue queue.Queue()



    threads = []

    for 
    i in range(4):

        
    threading.Thread(target=workerargs=(task_queue,))

        
    t.start()

        
    threads.append(t)



    for 
    task in range(10):

        
    task_queue.put(task)



    task_queue.join()



    for 
    i in range(4):

        
    task_queue.put(None)

    for 
    t in threads:

        
    t.join() 


    Может это прояснит пару моментов. Чекни и отпишись, что получилось.
    Йо, точно! Логирование может показать, где факап! Сто пудов что-то всплывет, что мы просто не замечаем!

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