1

我在两个不同的脚本中使用此处讨论的模板 python 守护程序来启动两个单独的守护程序。我想将它们组合成一个具有一个锁定文件等的守护程序脚本。但是,每个都有不同的循环计时器,一个在 1 分钟,另一个在 5 分钟。我从这个开始:

import os
import subprocess
import time
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/test.pid'
        self.pidfile_timeout = 5
    def run(self):

        try:
            while True:

                print "hello!"

                # set the sleep time for repeated action here:
                time.sleep(1)

        except Exception, e:
            raise


app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

显而易见的事情是创建另一个类,但我希望 pidfile 之类的基本内容保持不变。

4

2 回答 2

2

我不完全明白你为什么要这样做,但这应该可行:

makerun_Arun_Bfunctions 做两个独立的事情(显然不是那些名字),包括 sleep 等等。这并不重要,但将这些放在App课堂之外可能是有意义的。

然后创建一个run如下所示的函数:

def run(self):
    threads = [
         threading.Thread(target=run_A),
         threading.Thread(target=run_B)
    ]

    for thread in threads:
         thread.start()
    for thread in threads:
         thread.join()

这将为每个作业生成一个单独的线程,然后可以继续其愉快的方式。如果您在作业之间有任何共享资源,您将不得不担心锁定。

这假设作业执行速度很快,并且确切的时间并不重要;由于 CPython 的GIL,一次只有一个线程会运行 Python 语句,因此如果它们同时弹出,它们的运行速度会慢一些。multiprocessing如果您希望它们能够并行运行,您可以非常简单地将其切换为使用。

这将导致一些“计时器漂移”,因为您正在使用sleep(如果独立运行,您的守护程序也会如此)。如果这很重要,您可以改用中断,或者计算直到下一个五分钟倍数的时间,而不是仅仅休眠五分钟。

于 2012-05-22T00:16:15.070 回答
0

如果您的较长延迟不需要准确按时执行,您可以使用一个简单的累加器来跟踪较短操作的几个周期使用了多少时间。如果 LONG_DELAY 是 SHORT_DELAY 的整数倍,下面的代码将完美运行。如果它不是一个精确的倍数,则较长的周期仍将平均按请求的周期执行,但延迟可能会更短或更长,最多为 SHORT_DELAY 在任何给定的传递:

SHORT_DELAY = 60 # 1 minute
LONG_DELAY = 300 # 5 minutes

accum = LONG_DELAY

while True:
    do_short_delay_action()

    if accum >= LONG_DELAY:
        do_long_delay_action()
        accum -= LONG_DELAY

    time.sleep(SHORT_DELAY)
    accum += SHORT_DELAY
于 2012-05-22T00:45:35.583 回答