真正的程序员如何做服务器循环?

时间:2013-11-21 06:50:40

标签: python multithreading

每次运行此程序时,我都会听到我的cpu风扇正在提升。我怀疑忙着等待代码中的循环是原因。我想知道一个真正的程序员将如何优化这个?

from multiprocessing import Process, Queue
import threading
class PThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        #view leave will set this event
        self.event = threading.Event()
    def run(self):
        while 1:
            if not self.event.is_set():
               print 'run'
            else:
               break



def server_control(queue):
    while True:
        try:
            event = queue.get(False)
        except:
            event = None
        if event == 'DETECTED':
            print 'DETECTED'
            t = PThread()
            t.start()
        elif event == 'LEAVE':
            print 'Viewer_left'
            t.event.set()
            t.join()
        elif event == 'QUIT':
                break
q=Queue()
p = Process(target=server_control, args=(q,))
p.start()
p.join()

3 个答案:

答案 0 :(得分:5)

如果线程需要等待事件,它应该睡眠直到事件发生,而不是忙等待。您的事件对象具有wait()方法,可用于实现该方法。调用它,它将不会返回,直到某个其他线程在事件上调用set()(或超时过去,如果您指定一个)。与此同时,线程不使用CPU。

答案 1 :(得分:1)

多处理模块具有线程事件对象

的克隆
from multiprocessing import Process, Event

而不是使用队列。您应该在main中声明感兴趣的事件并将其传递给其他进程 在你的情况下:

detected = Event()
leave = Event()
exit = Event()

Process(target=server_control, args=(detected, leave, exit))

最后检查事件是否被触发或在循环中等待

答案 2 :(得分:0)

通过在循环中添加time.sleep(0)以将量子的剩余部分传递给另一个线程,可能会使循环变得不那么紧张。

另请参阅:How does a threading.Thread yield the rest of its quantum in Python?