Python线程池的CPU负载

时间:2012-03-19 12:23:48

标签: python threadpool

典型的Python线程池将具有如下结构:

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

所以似乎有一个连续监视任务队列。 这种连续监视任务队列的CPU密集程度如何?

介绍一些会更好吗? 睡眠(几毫秒)时间来降低CPU负载? 通过这种方式,可以在一段时间内停止对任务队列的监视 所有线程都忙,并减少CPU负载。

2 个答案:

答案 0 :(得分:3)

在我的计算机0.0%上阻止了1000个线程,.get() cpu加载:

#!/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 :(得分:1)

  

所以似乎有一个连续监视任务队列。

这取决于监控对你意味着什么。

Queue.get()阻止,直到某个项可用为止,这取决于阻止的实现方式。

我没有参考,但我认为应该有一个信号处理程序等待被唤醒,所以我会说它正在“睡觉”。