Загрузка процессора пула потоков Python - PullRequest
4 голосов
/ 19 марта 2012

Типичный пул потоков Python будет иметь такую ​​структуру:

def run(self):
    while True:
        z=self.some_task_queue.get() 
        do_work(z)

Похоже, что непрерывный мониторинг очереди задач. Насколько ресурсоемким является этот непрерывный мониторинг очереди задач?

Было бы лучше ввести некоторые время сна (несколько миллисекунд) для снижения нагрузки на процессор? Таким образом, можно остановить мониторинг очереди задач на некоторое время, когда все потоки заняты и уменьшают нагрузку на процессор.

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Загрузка 0.0% процессора, в то время как 1000 потоков заблокированы на .get() на моем компьютере:

#!/usr/bin/env python
from __future__ import print_function
import os
import time
from threading import Thread
from Queue import Queue

try: import psutil # pip install psutil
except ImportError:
    psutil = None

def f(queue):
    while True:
        item = queue.get() # block until an item is available
        print("got %s" % (item,))
        break # end thread

# create threads
q = Queue()
threads = [Thread(target=f, args=(q,)) for _ in xrange(1000)]

# starts them
for t in threads:
    t.daemon = True # die with the program
    t.start()


# show cpu load while the threads are blocked on `queue.get()`
if psutil is None:
    print('Observe cpu load yourself (or install psutil and rerun the script)')
    time.sleep(10) # observe cpu load
else:
    p = psutil.Process(os.getpid())
    for _ in xrange(10):
        print("cpu %s%%" % (p.get_cpu_percent(interval=0),))
        time.sleep(1)


# finish threads
for i in range(len(threads)):
    q.put_nowait(i) #note: queue is unlimited so there is no reason to wait

for t in threads: t.join() # wait for completion
print('done')
1 голос
/ 19 марта 2012

Похоже, что непрерывный мониторинг очереди задач.

Это зависит от того, что мониторинг означает для вас.

Queue.get() будет блокировать при необходимости, пока не станет доступен элемент , поэтому это зависит от того, как реализована блокировка.

У меня нет ссылки, но я думаю, что должен быть обработчик сигнала, ожидающий своего пробуждения, поэтому я бы сказал, что он "спит".

...