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

Тема: Как использовать queued thread в Python для многозадачности?

  1. Как использовать queued thread в Python для многозадачности?

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



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

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

  3. Привет! Для таких задач отлично подходят модули `queue` и `threading`. Вот пример, как можно заюзать их вместе:

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

    def worker
    (q):
    while 
    not q.empty():
    item q.get()
    print(
    f'Обработка {item}')
    time.sleep(1)  # Симулируем долгую обработку
    q.task_done()

    queue.Queue()
    for 
    i in range(10):
    q.put(i)

    threads = []
    for 
    _ in range(2):
    threading.Thread(target=workerargs=(q,))
    t.start()
    threads.append(t)

    q.join()
    for 
    t in threads:
    t.join() 
    Основной прикол этого кода – мы сначала заполняем очередь, а потом создаём воркеры, которые будут брать задачи из этой очереди и выполнять их. В конце ждём, пока все потоки завершатся. Залог успеха – правильно использовать `task_done()` и `join()`, чтобы не было затыков.

  4. Цитата Сообщение от Максим
    Привет! Для таких задач отлично подходят модули `queue` и `threading`. Вот пример, как можно заюзать их вместе:

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

    def worker
    (q):
    while 
    not q.empty():
    item q.get()
    print(
    f'Обработка {item}')
    time.sleep(1)  # Симулируем долгую обработку
    q.task_done()

    queue.Queue()
    for 
    i in range(10):
    q.put(i)

    threads = []
    for 
    _ in range(2):
    threading.Thread(target=workerargs=(q,))
    t.start()
    threads.append(t)

    q.join()
    for 
    t in threads:
    t.join() 
    Основной прикол этого кода – мы сначала заполняем очередь, а потом создаём воркеры, которые будут брать задачи из этой очереди и выполнять их. В конце ждём, пока все потоки завершатся. Залог успеха – правильно использовать `task_done()` и `join()`, чтобы не было затыков.
    Ого, спасибо за такой подробный код! Прямо как учебник по Python. Надо попробовать это у себя в проекте, а то я с этими потоками совсем не дружу еще.

  5. Хэй! Я тоже использовал `queue` и `threading`, и работало норм. Причем вверх тормашками: сначала создавал потоки, потом заполнял очередь. Главное помнить ставить `daemon=True` для потоков, чтобы они убивались, если главная программа закончится.

  6. Цитата Сообщение от annushka
    Хэй! Я тоже использовал `queue` и `threading`, и работало норм. Причем вверх тормашками: сначала создавал потоки, потом заполнял очередь. Главное помнить ставить `daemon=True` для потоков, чтобы они убивались, если главная программа закончится.
    Круто, про `daemon` не знал. Спасибо! Это очень полезная фича, особенно когда нужно, чтобы потоки не зависали после основного потока.

  7. Эй, вот тебе еще один примерчик, как можно заюзать:

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

    def worker
    (q):
    while 
    True:
    item q.get()
    if 
    item is None:
    break
    print(
    f'Processing {item}')
    time.sleep(2)  # Simulating long processing
    q.task_done()

    Queue()
    threads = []
    for 
    _ in range(4):
    Thread(target=workerargs=(q,))
    t.start()
    threads.append(t)

    for 
    item in range(10):
    q.put(item)

    q.join()

    for 
    t in threads:
    q.put(None)
    for 
    t in threads:
    t.join() 
    Здесь мы используем `None` для завершения работы потоков. Это вызывает выход из бесконечного цикла. Простая, но мощная штука.

  8. Цитата Сообщение от GalacticGuardian
    Эй, вот тебе еще один примерчик, как можно заюзать:

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

    def worker
    (q):
    while 
    True:
    item q.get()
    if 
    item is None:
    break
    print(
    f'Processing {item}')
    time.sleep(2)  # Simulating long processing
    q.task_done()

    Queue()
    threads = []
    for 
    _ in range(4):
    Thread(target=workerargs=(q,))
    t.start()
    threads.append(t)

    for 
    item in range(10):
    q.put(item)

    q.join()

    for 
    t in threads:
    q.put(None)
    for 
    t in threads:
    t.join() 
    Здесь мы используем `None` для завершения работы потоков. Это вызывает выход из бесконечного цикла. Простая, но мощная штука.
    О, круто, че-то про бесконечные циклы забыл совсем. `None` выглядит как шикарное завершение, чтобы они не зависали.

  9. Йоу, я бы тебе порекомендовал еще глянуть в сторону библиотеки `concurrent.futures`, если вдруг не хочется морочить голову с потоками и очередями напрямую. Там можно просто и красиво все это завернуть в пару строк кода, не напрягаясь.

  10. Цитата Сообщение от ГелиодоровыйЗакат
    Йоу, я бы тебе порекомендовал еще глянуть в сторону библиотеки `concurrent.futures`, если вдруг не хочется морочить голову с потоками и очередями напрямую. Там можно просто и красиво все это завернуть в пару строк кода, не напрягаясь.
    Точняк, `concurrent.futures` – тема! Можно заморочиться с примерами, но она реально облегчает жизнь. Спасибо за напоминание!

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