1

ここで説明するテンプレートpythonデーモンを2つの異なるスクリプトで使用して、2つの別々のデーモンを起動しています。それらを1つのロックファイルなどを持つ1つのデーモンスクリプトに結合したいと思います。ただし、ループタイマーはそれぞれ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

私はあなたがこれをしたい理由を完全には理解していませんが、これはうまくいくはずです:

スリープなどを含む、2つの独立したこと(明らかにそれらの名前ではない)を実行するように作成run_Aおよび機能します。run_Bそれは実際には問題ではありませんが、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により、一度に1つのスレッドのみがPythonステートメントを実行するため、同時にポップアップすると、実行速度が少し遅くなります。multiprocessing並行して実行できるようにする場合は、これを使用するように簡単に切り替えることができます。

これにより、使用しているために「タイマードリフト」が発生しsleepます(デーモンを独立して実行した場合と同様)。これが重要な場合は、代わりに割り込みを使用するか、5分間寝るだけでなく、次の5分の倍数までの時間を計算することができます。

于 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 に答える