我有一个直播concurrent.futures.ThreadPoolExecutor
。我想检查它的状态。我想知道有多少线程,有多少正在处理任务,有哪些任务,有多少是空闲的,哪些任务在队列中。我怎样才能找到这些东西?
问问题
13351 次
2 回答
14
池和待处理的工作项队列有一些可见性。要找出可用的内容,请打印poolx.__dict__
以查看结构。阅读 ThreadPool 代码,很不错:concurrent.futures.thread
下面创建一个带有一个线程的池。然后它会创建两个作业:一个休眠 3 秒,另一个立即返回。然后打印池中待处理工作项的数量。
之后,我们打印出工作队列中的项目。在这种情况下,一个线程已经在执行该time.sleep(3)
函数,所以它不在队列中。sleep
打印带有 args[0]
和 kwargs的函数{}
,因为这是池要运行的下一个工作项。
感谢@dano 对非破坏性队列的洞察力,以及@abarnert。
资源
import concurrent.futures, time
poolx = concurrent.futures.ThreadPoolExecutor(max_workers=1)
poolx.submit(time.sleep, 3)
poolx.submit(time.sleep, 0) # very fast
print('pending:', poolx._work_queue.qsize(), 'jobs')
print('threads:', len(poolx._threads))
print()
# TODO: make thread safe; work on copy of queue?
print('Estimated Pending Work Queue:')
for num,item in enumerate(poolx._work_queue.queue):
print('{}\t{}\t{}\t{}'.format(
num+1, item.fn, item.args, item.kwargs,
))
poolx.shutdown(wait=False)
输出
pending: 1 jobs
threads: 1
Pending Work Queue:
1 <built-in function sleep> (0,) {}
于 2014-08-24T18:23:42.083 回答
0
也不是非常干净可靠的寻找pending
期货的方法,但我这样做是这样的:
if 'state=pending' in str(future):
logger.debug('PENDING')
elif future.running():
logger.debug('RUNNING')
elif future.cancelled():
logger.debug('CANCELLED')
elif future.exception():
logger.debug('EXCEPTION')
elif future.done():
logger.debug('DONE')
于 2019-07-24T18:00:16.567 回答