Не может ли вызов get() в результате pathos apipe() привести к чрезмерному использованию памяти?

#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 заполнит вашу память, если только результат, возвращаемый объект и/или другие объекты с ссылками на указатель на результат не будут удалены.