Как завершить очередь Python и поручить всем потребительским потокам завершить свои задачи?

Как завершить очередь Python и поручить всем потребительским потокам завершить свои задачи?
Как завершить очередь Python и поручить всем потребительским потокам завершить свои задачи? - marius @ Unsplash
  • Предложение @user253751 на самом деле является разумным подходом, и оно должно работать с большинством систем очередей:

    Когда рабочий поток получает сигнал из очереди, он перестает потреблять эту очередь (возможно, с помощью операции отмены подписки, но в зависимости от системы может быть достаточно просто завершить работу после следующего шага) и помещает сигнальный элемент в очередь для следующего рабочего процесса. процесс. Я иногда использовал этот подход, и он работает достаточно хорошо. Я не думаю, что существует состояние гонки, если только рабочий не может умереть между получением сторожевого и повторной вставкой его в очередь (что всегда возможно, но трудно надежно справляться с паническими сбоями).

  • Другим вариантом для рабочих будет получение ресурсов с некоторым тайм-аутом, если это поддерживается, и проверка глобального флага завершения, чтобы увидеть, должны ли они продолжать работу каждый раз в цикле. Некоторый набросок псевдокода:

    while (!termination_flag) {
      resource = queue.receive_with_timeout(TIMEOUT_DURATION);
      if (resource != TIMED_OUT) {
        process(resource);
      }
    }
    

    Это вызывает низкий уровень ожидания, когда ресурсы производятся с гораздо меньшей скоростью, чем рабочие могут их обработать, но в зависимости от выбора TIMEOUT_DURATION это должно быть довольно незначительным.

Прикрепляю к посту несколько видео по теме:

Прикрепленное видео 1 - Математические методы в цифровой экономике, Величко А. С., Лекция "RUSSKY.DIGITAL Beta", ДВФУ


LetsCodeIt, 28 апреля 2023 г., 11:55