每次运行此程序时,我都会听到我的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()
答案 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?