我正在编写一个队列处理应用程序,它使用线程来等待并响应要传递给应用程序的队列消息.对于应用程序的主要部分,它只需要保持活动状态.对于代码示例,例如:
while True: pass
要么
while True: time.sleep(1)
哪一个对系统的影响最小?什么是什么都不做,但保持python应用程序运行?
Jay*_*Jay 61
我认为time.sleep()将减少系统的开销.使用pass将导致循环立即重新评估并固定CPU,而使用time.sleep将允许执行暂时中止.
编辑:只是为了证明这一点,如果你启动python解释器并运行:
>>> while True:
... pass
...
Run Code Online (Sandbox Code Playgroud)
您可以观看Python立即开始吃掉90-100%的CPU,而不是:
>>> import time
>>> while True:
... time.sleep(1)
...
Run Code Online (Sandbox Code Playgroud)
甚至几乎没有在Activity Monitor上注册(在这里使用OS X,但每个平台应该是相同的).
tzo*_*zot 27
为什么睡觉?你不想睡觉,你想等待线程完成.
所以
# store the threads you start in a your_threads list, then
for a_thread in your_threads:
a_thread.join()
Run Code Online (Sandbox Code Playgroud)
请参阅:thread.join
Mat*_*eld 10
如果您正在寻找一种简短的零CPU方式来循环直到KeyboardInterrupt,您可以使用:
from threading import Event
Event().wait()
Run Code Online (Sandbox Code Playgroud)
注意:由于存在错误,这仅适用于Python 3.2+.此外,它似乎无法在Windows上工作.出于这个原因,while True: sleep(1)可能是更好的选择.
对于某些背景,Event对象通常用于等待长时间运行的进程完成:
def do_task():
sleep(10)
print('Task complete.')
event.set()
event = Event()
Thread(do_task).start()
event.wait()
print('Continuing...')
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
Task complete.
Continuing...
Run Code Online (Sandbox Code Playgroud)
Ada*_*dam 10
signal.pause()是另一种解决方案,请参阅https://docs.python.org/3/library/signal.html#signal.pause
使进程休眠直到接收到信号;然后将调用适当的处理程序。什么都不返回。不在 Windows 上。(请参阅 Unix 手册页信号 (2)。)
| 归档时间: |
|
| 查看次数: |
32170 次 |
| 最近记录: |