23

ライブがありconcurrent.futures.ThreadPoolExecutorます。その状態を確認したい。スレッドの数、処理中のタスクの数とタスクの数、空いているスレッドの数、キューに入っているタスクを知りたいです。どうすればこれらのことを知ることができますか?

4

2 に答える 2

14

プールと保留中のワークアイテム キューをある程度可視化できます。利用可能なものを確認するには、印刷poolx.__dict__して構造を確認してください。ThreadPool コードを読んでください

以下は、1 つのスレッドでプールを作成します。次に、2 つのジョブを作成します。1 つは 3 秒間スリープし、もう 1 つはすぐに戻ります。次に、プールの保留中の作業項目の数が出力されます。

その後、ワーク キューから項目を出力します。この場合、スレッドはすでにtime.sleep(3)関数を実行しているため、キューにはありません。sleepargs[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 に答える