Python 真正的程序员如何实现服务器循环?

Python 真正的程序员如何实现服务器循环?,python,multithreading,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 t

每次运行这个程序时,我都听到我的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()

如果线程需要等待事件,那么它应该一直休眠到事件发生,而不是忙着等待。事件对象有一个
wait()。调用它,它将不会返回,直到其他线程对事件调用了
set()
(或者如果您指定了超时,则超时已过)。同时,线程不使用CPU。

通过在循环中添加
time.sleep(0)
,将剩余的量传递给另一个线程,可以使循环稍微不那么紧凑


另请参见:

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

from multiprocessing import Process, Event
而不是使用队列。您应该在主进程中声明感兴趣的事件,并将它们传递给其他进程 就你而言:

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

Process(target=server_control, args=(detected, leave, exit))
最后检查事件是否已触发或在循环中等待