Django マネジメントコマンドの重複起動防止デコレータ

(コメント)

def find_process_ids(pattern):
    """
    pattern にマッチするプロセスIDを探して返す (自分以外)
    :rtype: list
    """
    self_pid = os.getpid()
    try:
        out = subprocess.check_output(['pgrep', '-f', pattern])
        return list(filter(
            lambda x: x != self_pid, map(int, out.splitlines())))
    except subprocess.CalledProcessError:
        return []


def runs_once(batch_name):
    """
    マネジメントコマンドの重複起動防止

    @runs_once(__file__)
    def handle(...):
        ...

    """
    re_batch_name = re.compile(r'^/.*/(\w+)\.py$')
    m = re_batch_name.match(batch_name)
    if m:
        batch_name = m.group(1)

    def _inner(func):
        @wraps(func)
        def decorate(*args, **kwargs):
            process_ids = find_process_ids(batch_name)
            if process_ids:
                print('process already exists. {}, {}'.format(
                    batch_name, process_ids)
                )
                return
            else:
                return func(*args, **kwargs)

        return decorate

    return _inner
現在未評価

コメント

最近のツイート

  • 小泉しゅうすけ@寒川町議会議員

    小泉しゅうすけ@寒川町議会議員 @KoizumiSamukawa

    ytyng

    漫画歴代発行部数ランキングとか見ると、上位はことごとく犯罪行為が平気で描かれている作品ばかりです。で、これらの漫画を読んで犯罪を起こした人はどの程度居るのでしょうか…ゴルゴ13を読んでスナイパーになった人は果たして存在するのかどう… https://t.co/ndFS6wezxQ
    1 週間, 6 日 前

  • ytyng

    ytyng @ytyng

    MacBookのロゴを隠してるとプロっぽい。小並感だけど。 https://t.co/SRe5T68hHR
    2 週間 前

  • ytyng

    ytyng @ytyng

    初めてnpmにパッケージ上げた
    2 週間, 4 日 前