Следующий код запускает 5 задач многопроцессорной обработки. Эти задачи печатают сообщение, затем переходят в режим сна на случайный период времени, а затем повторяют это снова. Это повторяется 10 раз, поэтому весь набор задач должен завершиться максимум за 50 секунд.
При первом создании пула выводятся адреса 5 объектов пула.
При первом создании пула распечатываются адреса 5 объектов пула.
p>
Этот код работает нормально, но он был завершен до завершения всей своей работы. При повторном запуске вы увидите, что 5 объектам пула назначены новые адреса.
После этого процесса остановки операции до ее завершения (прерывание клавиатуры) несколько раз код перестает работать. Задачи никогда не создаются, и код выполняется до конца. И распределение объектов пула показывает, что они распределяют одни и те же объекты снова и снова, тогда как до назначения новых адресов объектов.
Таким образом, получается, что ресурсы ОС выделяются и никогда не освобождаются. И когда все эти ресурсы израсходованы, код перестает работать. Но даже когда командная строка, под которой он запущен, завершается (его окно закрывается), эти ресурсы не возвращаются. А когда открывается новая командная строка и приложение запускается снова, вы можете видеть, что назначаются те же идентификаторы объектов, задачи никогда не запускаются, а код падает. Обычно код останавливается в пуле.join(), ожидая завершения рабочих (задачи).
Похоже, не существует способа заставить ОС освободить эти ресурсы пула. Единственный способ — перезагрузить ОС.
Во время отладки кода маловероятно, что когда-нибудь он запустится до завершения и появятся функции Pool.close() и poll.join. () выполнено. ТАК, после нескольких выполнений тестируемого кода больше не выделяются задачи.
Таким образом, возникает вопрос: как мы можем гарантировать, что порожденные задачи будут завершены, а их ресурсы вернутся в пул?
import multiprocessing
import time
import random
# Simultaneous tasks running
def task(id):
for i in range(10):
stime = random.randint(1,5)
print(f"Task {id}: Woke up. Now sleep {stime}")
time.sleep(stime)
exit(0)
if __name__ == "__main__":
print ('create pool of tasks')
pool = multiprocessing.Pool(processes=5)
print (pool)
# Start 5 asynchronous tasks
for i in range(1,6):
result = pool.apply_async(task, i)
print (result)
pool.close()
# Wait for all tasks to complete
pool.join()
print ('end program')
Подробнее здесь: https://stackoverflow.com/questions/790 ... windows-11
Многопроцессорный пул перестает работать — Windows 11 ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение