ライブがありconcurrent.futures.ThreadPoolExecutor
ます。その状態を確認したい。スレッドの数、処理中のタスクの数とタスクの数、空いているスレッドの数、キューに入っているタスクを知りたいです。どうすればこれらのことを知ることができますか?
13351 次
2 に答える
14
プールと保留中のワークアイテム キューをある程度可視化できます。利用可能なものを確認するには、印刷poolx.__dict__
して構造を確認してください。ThreadPool コードを読んでください。
以下は、1 つのスレッドでプールを作成します。次に、2 つのジョブを作成します。1 つは 3 秒間スリープし、もう 1 つはすぐに戻ります。次に、プールの保留中の作業項目の数が出力されます。
その後、ワーク キューから項目を出力します。この場合、スレッドはすでに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 に答える