如何防止向ThreadPoolExecutor提交过多作业?

时间:2018-11-05 01:51:17

标签: python concurrency

我最近遇到了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

0 个答案:

没有答案