我最近遇到了ThreadPoolExecutor类,并一直在玩具项目中使用它。 ThreadPoolExecutor有一个_work_queue
字段-当我submit
个任务多于分配给执行程序的工作人员数量时,该字段开始填充:
>>> from concurrent.futures import ThreadPoolExecutor
>>> from time import sleep
>>> def wait():
... sleep(1000)
...
>>> tpe = ThreadPoolExecutor(max_workers=10)
>>> tpe._work_queue.qsize()
0
>>> for i in range(11):
... tpe.submit(wait)
...
<Future at 0x10cf63908 state=running>
[...snip...]
<Future at 0x10d20b278 state=pending>
>>> tpe._work_queue.qsize()
1
我注意到_work_queue
有一个方法full()
,据推测,该方法表明队列不能再执行任何任务。如果提交的任务数量超出队列可容纳的数量,我希望会引发异常-但是,我看不到文档中任何地方都引用了该行为,即使添加了100,000个以上的任务,我也无法复制它给我的执行人。
现在,我通过以下方式为这种行为辩护:
for task_to_do in my_tasks:
if tpe._work_queue.full():
sleep(0.1)
tpe.submit(task_to_do)
由于引用了“私有”队列,因此感觉很笨拙-我想这样做会更加Python化:
for task_to_do in my_tasks:
task_added = False
while not task_added:
try:
tpe.submit(task_to_do)
task_added = True
except SomeExceptionWhoseNameIDoNotKnowYet as e:
pass
但是,为了做到这一点,我需要知道会抛出哪种Exception
(或者,我猜只是抓到Exception
)