Многопоточность Python: Как создавать последовательный поток в каждой итерации while для обработки чего-либо

#python #multithreading

Вопрос:

Цель как асинхронных методов, так и потоков состоит в том, чтобы обеспечить возможность одновременной обработки нескольких задач.

Но у меня есть задача, в которой мне нужно последовательно запускать потоки, обрабатывающие некоторые строки, и я понятия не имею, как это сделать.

Шаг за шагом будет выглядеть следующим образом:

  1. Если условие не выполнено
  2. Создайте новый поток
  3. Выполняет функцию process_something_function, которая изменяет условие
  4. дождитесь завершения всей обработки в этом потоке
  5. Усыпите эту нить
  6. Проверьте, выполнено ли это условие
  7. Если выполнено, завершите код и выведите условие, если нет, повторите все вышесказанное.

По способу кодирования будет выглядеть так:

 def function_process_something():
   process_something(condition)
   sleep(1)

while(condition is not reached):
   create a new thread()
   new thread executes function_process_something(condition);
 

Почти в каждом примере, который я видел, используется потоковый подход для выполнения параллельных заданий, а не последовательных.
Еще одна вещь, которая меня смущает, заключается в том, что у нас нет фиксированного количества создаваемых потоков (это зависит от времени, в течение которого function_process_something должен выполняться для выполнения условия de).

Комментарии:

1. Зачем использовать потоки, если вам не нужно параллельное выполнение? Просто запустите функцию в обычном режиме

2. Я полностью согласен с вами, но эта задача предназначена для исследовательских целей, это требование.

Ответ №1:

Если нет причин, по которым требуется другой поток, вы можете просто выполнить работу с основным потоком.

Однако, если вам действительно нужна работа, выполняемая в другом потоке (например, чтобы не влиять на поток графического интерфейса, который должен оставаться отзывчивым), но вы все равно хотите, чтобы она выполнялась последовательно, обычный подход заключается в том, чтобы один другой поток (рабочий) выполнялся с рабочей очередью.

Основной поток просто добавляет объекты в рабочую очередь, в то время как рабочий поток ожидает появления объектов в очереди и обрабатывает их по одному за раз.

В этом сценарии вам не нужно создавать и уничтожать потоки на лету, просто создайте рабочий поток заранее. Он в основном ничего не будет делать, если что-то не будет добавлено в рабочую очередь, поэтому его можно оставить до тех пор, пока вы не захотите закрыть программу.

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