2013-11-21 31 views
2

每次運行這個程序的時候,我都聽到我的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() 

回答

1

多處理模塊具有線程的事件對象

from multiprocessing import Process, Event 

改爲使用隊列的克隆。你應該在你的主要申報利益的事件,並將它們傳遞給其他進程 你的情況:

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

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

最後檢查,如果該事件被解僱或等待在循環

5

如果一個線程需要等待一個事件,它應該休眠直到事件發生,而不是忙於等待。您的事件對象有一個wait()方法可用於完成此操作。調用它,它將不會返回,直到其他線程在事件上調用set()(或者超時時間過去,如果指定了一個)。同時,該線程不使用CPU。