После выполнения кода в отдельном треде в ThreadPoolExecutor он не убивается
У меня есть веб приложение на aiohttp, в котором на фоне каждую минуту обновляется кэш походом в сторонний ресурс. Все это делается асинхронно и при получении кэш записывается в файл в отдельном треде таким кодом. Вообще такая же ситуация возникает даже просто с десериализацией json в отдельном треде ответа стороннего ресурса
def _save_to_file(self, values):
try:
self._make_dirs()
with tempfile.NamedTemporaryFile(
mode='w', dir=self._snapshot_path, delete=False,
) as tmp:
json.dump(values, tmp)
os.replace(tmp.name, self._full_snapshot_path)
except (OSError, IOError) as exc:
user = getpass.getuser()
# avoid file access error on local run
if user == USER:
raise
else:
logger.info(
'do not write snapshot file, user %s: %s', user, exc,
)
await asyncio.get_event_loop().run_in_executor(
None, _save_to_file, values,
)
Но в итоге процесс порождает потоки, которые в последствие не умирают и их число неограниченно растет, пока не прибьется весь процесс. Наблюдал за периодичностью возникновения потоков с помощью команды ниже и время совпадает с обновлением кеша
watch ps -eo pid,nlwp,command