Python:长时间运行进程的通过或休眠?

时间:2009-02-09 17:15:42

标签: python

我正在编写一个队列处理应用程序,它使用线程来等待和响应要传递给应用程序的队列消息。对于应用程序的主要部分,它只需要保持活动状态。对于代码示例,如:

while True:
  pass

while True:
  time.sleep(1)

哪一个对系统的影响最小?什么是什么都不做,但保持python应用程序运行?

7 个答案:

答案 0 :(得分:59)

我认为 time.sleep()将减少系统的开销。使用传递将导致循环立即重新评估并固定CPU,而使用time.sleep将允许执行暂时中止。

编辑:只是为了证明这一点,如果你启动python解释器并运行它:

>>> while True:
...     pass
... 

您可以观看Python立即开始吃掉90-100%的CPU,而不是:

>>> import time 
>>> while True:
...     time.sleep(1)
... 

甚至几乎没有在Activity Monitor上注册(在这里使用OS X,但每个平台都应该相同)。

答案 1 :(得分:24)

为什么要睡觉?你不想睡觉,你想等待线程完成。

所以

# store the threads you start in a your_threads list, then
for a_thread in your_threads:
    a_thread.join()

请参阅:thread.join

答案 2 :(得分:8)

如果您正在寻找一种简短的零CPU方式来循环直到KeyboardInterrupt,您可以使用:

from threading import Event

Event().wait()

注意:由于a bug,这仅适用于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...')

打印哪些:

Task complete.
Continuing...

答案 3 :(得分:6)

你没有为你真正做的事情提供太多的背景,但可能会使用Queue而不是显式的忙等待循环?如果没有,我认为sleep会更好,因为我相信它会消耗更少的CPU(正如其他人已经注意到的那样)。

[根据以下评论中的其他信息进行编辑。]

也许这是显而易见的,但无论如何,在从阻塞套接字读取信息的情况下,可以做的是从套接字读取一个线程并将适当格式化的消息发布到{ {1}},然后让其他“工作”线程从该队列中读取;然后,工作人员将阻止从队列中读取,而不需要Queuepass

答案 4 :(得分:4)

我一直看到/听说使用睡眠是更好的方法。使用sleep将使你的Python解释器的CPU使用率不再过时。

答案 5 :(得分:2)

signal.pause()是另一种解决方案,请参见https://docs.python.org/3/library/signal.html#signal.pause

  

使进程进入睡眠状态,直到接收到信号为止;然后将调用适当的处理程序。不返回任何内容。不在Windows上。 (请参见Unix手册页上的signal(2)。)

答案 6 :(得分:0)

在Python中使用sleep运行方法作为后台线程

    import threading
    import time


    class ThreadingExample(object):
        """ Threading example class
        The run() method will be started and it will run in the background
        until the application exits.
        """

        def __init__(self, interval=1):
            """ Constructor
            :type interval: int
            :param interval: Check interval, in seconds
            """
            self.interval = interval

            thread = threading.Thread(target=self.run, args=())
            thread.daemon = True                            # Daemonize thread
            thread.start()                                  # Start the execution

        def run(self):
            """ Method that runs forever """
            while True:
                # Do something
                print('Doing something imporant in the background')

                time.sleep(self.interval)

    example = ThreadingExample()
    time.sleep(3)
    print('Checkpoint')
    time.sleep(2)
    print('Bye')