gpt4 book ai didi

python - 确定 Python JoinableQueue 中有多少项

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:15 24 4
gpt4 key购买 nike

我正在使用 Python multiprocessing.JoinableQueue 类,并且我试图对队列施加大小限制。如果队列已满达到此限制,循环将休眠并在队列中的空间释放时尝试重新添加任务,但我似乎找不到可靠的方法来跟踪队列大小。

我正在考虑使用这样的逻辑,却发现 Queue 模块中我期望的 .qsize() 函数不存在:

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 ?但这似乎不是最好的选择。

如有任何意愿,我们将不胜感激:)

最佳答案

JoinableQueue 应该有一个 .full() 方法,您应该能够使用该方法来确定队列是否有空间容纳新项目。使用 full() 而不是 qsize() 意味着您可以避免单独跟踪队列的最大大小。

但是,我会避免使用它,因为它与 .qsize() 一样不可靠。队列在读取时可能正在修改中,因此无论如何您都必须处理异常情况。在带有 sleep 的循环中使用 try.... except 可能是实现您想要尝试的目标的最清晰、最安全和最实用的方法。

将其包装在辅助函数中可能会使代码更容易(您必须修改它以处理 func 的参数,或者将调用包装在无参数 lambda 中,然后再将其传递给 try_until()

def try_until(func, max_tries, sleep_time):
for _ in range(0,max_tries):
try:
return func()
except:
sleep(sleep_time)
raise WellNamedException()

关于python - 确定 Python JoinableQueue 中有多少项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com