#pathos
Вопрос:
Если вы используете пул потоков pathos и вызываете apipe() большое количество раз, но никогда не вызываете get() в результате, возможно ли, что это приведет к внутреннему накоплению состояния pathos (и, следовательно, к использованию памяти)?
Комментарии:
1. Вы имеете в виду, например, продолжает ли он заполнять очередь результатов?
2. Можете ли вы добавить какой-нибудь код, чтобы показать, что именно вы делаете? Например, удаляете ли вы возвращенные объекты ApplyResult? Какую версию python, pathos и т. Д. вы используете? Объект ApplyResult указывает на пул или на событие потоковой передачи или иным образом, в зависимости от версии python и т. Д.
3. Наше приложение создает пул задач следующим образом: task_pool = пул потоков(24). Позже в разных местах кода запускаются такие задачи, как: task_pool.apipe(…). В документах говорится, что apipe возвращает результат, и можно вызвать get() для этого объекта, чтобы получить результат. Это заставляет меня думать, что пафос должен быть «запоминанием» результата задачи, чтобы get() мог получить его позже. Итак, десять миллионов вызовов apipe без get () заставят pathos внутренне запомнить все связанные результаты, которые в противном случае он мог бы удалить, если бы вызывался get ()?
Ответ №1:
Без подробностей о версии python, пафосе и т. Д., Которые вас интересуют… Я могу дать вам общий ответ. Вызов apipe
из ThreadPool
экземпляра создает ApplyResult
объект. Вызов get()
экземпляра ApplyResult
объекта вернет результат, соответствующий входным данным apipe
, подлежащим оценке. Итак, что будет, прежде чем ты позвонишь get
? Точные сведения зависят от версии python и пафоса, но, как правило , при вызове apipe
создается ApplyResult
экземпляр, и оценка входных данных apipe
отправляется в новый поток. ApplyResult
Экземпляр имеет указатель либо на пул, либо на очередь, либо на какой-либо другой объект, который при вызове «получит результат» get
. Вычисленный результат, полученный в новом потоке, сохраняется в памяти до тех пор, пока не будет вызван get… или пока объект, содержащий результат, не будет освобожден из памяти (однако это происходит). Это хранилище памяти, скорее всего, находится в объекте в threading
модуле… но это может быть в другом месте, в зависимости от версии python, пафоса и т. Д. Если бы вы удалили соответствующий объект и освободили его из памяти, тогда вам не нужно было бы звонить get
, чтобы освободить память. Однако короткий ответ «скорее всего, да», не вызов get
заполнит вашу память, если только результат, возвращаемый объект и/или другие объекты с ссылками на указатель на результат не будут удалены.