Если не существует других процессов, которые будут использовать этот пул объектов, не похоже, что будет причина возвращать истекшие в пул, прежде чем вам потребуется выделить один.Если вы проверяете объекты с истекшим сроком действия и возвращаете их в пул, прежде чем размещать новые, это должно обеспечить адекватную очистку.
Чтобы упростить саму очистку, рассмотрите возможность создания списка кортежей (expire_time, object) и используйте bisect.insort () , чтобы упорядочить список по первому значению -время истечения:
que_tuple = (time.time() + EXPIRY_DELAY, obj)
bisect.insort(my_list, que_tuple)
Каждый раз, когда вы отправляетесь зарезервировать другой объект, вы можете проверять элементы с истекшим сроком действия, чтобы вернуться в бассейн.Используя отсортированный список, вам нужно только проверить 0-й элемент на предмет истечения срока действия, а затем очистить элементы по порядку, пока не найдете элемент, срок действия которого не истек.Примерно так:
time_to_act, obj = my_list[0]
while time.time() > time_to_act:
return_to_pool( obj ) # whatever is necessary to clean-up your objects
my_list.pop(0)
time_to_act, obj = my_list[0]
Если вы решите, что вам нужно реализовать таймер, эта концепция очереди все равно будет полезна.В противном случае вы могли бы иметь таймер для истечения срока действия каждого объекта.Часто имеется ограниченное количество доступных системных таймеров, и вы можете столкнуться с нехваткой ресурсов.Очередь истечения срока действия (my_list) позволяет одному таймеру объявить следующий истекающий объект, и таймер будет сброшен на новый заголовок списка.
Надеюсь, это поможет!