#python #multithreading
Вопрос:
Цель как асинхронных методов, так и потоков состоит в том, чтобы обеспечить возможность одновременной обработки нескольких задач.
Но у меня есть задача, в которой мне нужно последовательно запускать потоки, обрабатывающие некоторые строки, и я понятия не имею, как это сделать.
Шаг за шагом будет выглядеть следующим образом:
- Если условие не выполнено
- Создайте новый поток
- Выполняет функцию process_something_function, которая изменяет условие
- дождитесь завершения всей обработки в этом потоке
- Усыпите эту нить
- Проверьте, выполнено ли это условие
- Если выполнено, завершите код и выведите условие, если нет, повторите все вышесказанное.
По способу кодирования будет выглядеть так:
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:
Если нет причин, по которым требуется другой поток, вы можете просто выполнить работу с основным потоком.
Однако, если вам действительно нужна работа, выполняемая в другом потоке (например, чтобы не влиять на поток графического интерфейса, который должен оставаться отзывчивым), но вы все равно хотите, чтобы она выполнялась последовательно, обычный подход заключается в том, чтобы один другой поток (рабочий) выполнялся с рабочей очередью.
Основной поток просто добавляет объекты в рабочую очередь, в то время как рабочий поток ожидает появления объектов в очереди и обрабатывает их по одному за раз.
В этом сценарии вам не нужно создавать и уничтожать потоки на лету, просто создайте рабочий поток заранее. Он в основном ничего не будет делать, если что-то не будет добавлено в рабочую очередь, поэтому его можно оставить до тех пор, пока вы не захотите закрыть программу.
Раскручивание нескольких потоков, где каждый должен дождаться завершения предыдущего, прежде чем что-либо делать, возможно, но на самом деле это ничего вам не даст.