Проверка на `concurrent.futures.ThreadPoolExecutor`

У меня есть живой concurrent.futures.ThreadPoolExecutor, Я хочу проверить его статус. Я хочу знать, сколько потоков существует, сколько обрабатывает задачи и какие задачи, сколько свободно, и какие задачи находятся в очереди. Как я могу узнать эти вещи?

1 ответ

Решение

Существует некоторая видимость в пуле и в очереди ожидающих рабочих мест. Чтобы узнать, что доступно, распечатайте poolx.__dict__ чтобы увидеть структуру. Прочитайте код ThreadPool, он довольно хорош: concurrent.futures.thread

Следующее создает пул с одним потоком. Затем он создает две работы: одна спит в течение 3 секунд, другая немедленно возвращается. Затем будет напечатано количество ожидающих рабочих элементов пула.

После этого мы распечатываем элементы из рабочей очереди. В этом случае поток уже выполняет time.sleep(3) функция, так что это не в очереди. Функция sleep с аргументами [0] и карги {} печатается, потому что это следующий рабочий элемент для пула для запуска.

Престижность @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,)    {}

Не очень чистый и надежный способ найти pending Futures, но я делаю это так:

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')
Другие вопросы по тегам