Я использую класс Python multiprocessing.JoinableQueue
, и я пытаюсь наложить ограничение размера на очередь. Если очередь заполнена до этого предела, цикл будет спать и попытаться повторно добавить задачу, когда пространство в очереди освободится, но я не могу найти надежный способ отслеживания размера очереди.Определить, сколько элементов находится в Python JoinableQueue
Я думал об использовании какой-то логики, как это, только чтобы выяснить функцию .qsize()
я ожидал от Queue
модуля не существует:
from multiprocessing import JoinableQueue
QUEUE_SIZE = 50
QUEUE_WAIT = 900
task_queue = JoinableQueue(QUEUE_SIZE)
....
if QUEUE_SIZE is not 0:
# if QUEUE_SIZE is zero, there is no limit on the queue
while True:
# if the size of the queue equals our self-imposed limit, wait to try and add this task
if task_queue.qsize() == QUEUE_SIZE:
print 'task queue limit is met. task will be added when space clears'
time.sleep(QUEUE_WAIT)
else:
# add the task if we can
self.task_queue.put(path)
print 'task queued" task="%s"' % path)
break
else:
# if there's no limit just add the file_path
self.task_queue.put(file_path)
Есть ли предпочтительный способ отследить, сколько пунктов в настоящее время в JoinableQueue или, возможно, лучший способ повторить попытку добавления элементов в очередь, если они не могут быть добавлены сразу? Может быть, всего лишь try/except/sleep
внутри петли? Однако это не лучший вариант.
Любой бы очень ценится :)
«try/except/sleep» в цикле, вероятно, самый подходящий способ сделать это (хотя я должен признать, что раньше я не использовал JoinableQueue). Однако отслеживание размера чего-то, к которому обращаются из нескольких потоков вне любой блокировки, которую выполняет JoinableQueue, кажется немного раздражительным. Вам все равно придется обрабатывать случай «except», так как могут быть другие причины, по которым очередь не примет ваш элемент. –