텍스트 파일을 통해 여러 개의 실행 과정을 간단하게 파악하는 파이톤의 분형기

10446 단어 Pythontech
예를 들어 서버에 여러 개의 작업을 던질 때 어떤 작업을 던질지 잊어버릴 때가 있다.
스스로 깊이 공부하는 실험용 각본을 던졌을 때 어떤 실험을 넣었는지 상당히 잊어버렸다.
물론 mlflow 등 실험 관리 도구를 사용하면 어느 모델의 학습 진전을 어느 정도 파악할 수 있지만'공부용 스크립트는 어떤 지령이고, 언제 어느 서버에서 던졌는지'같은 정보는 관리할 수 없다(가능).
로컬 서버도 있지만 뭘 시작해야 할지 확인하기 힘들다.
이에 따라 학습용 스크립트가 던져질 때 랩으로 감싸기main() 어느 과정이 언제 일어날지 파악할 수 있는 장식물을 적었다.
다음 느낌으로 memoize_runnnig_processes 이번에 만든 장식품을 사용할 수 있습니다.
미묘하다
hoge.py
@memoize_runnnig_processes
def main():
    exp = HogeExperiment()
    exp.run()
    
if __name__ == "__main__":
    main()
이렇게 하면 현재 디렉터리.runnning-processes.txt의 텍스트 파일에 실행 중인 정보를 기록하고 그 내용이 이렇게 느껴진다.
.runnning-processes.txt
server1	2021年5月1日 3時17分36.110417秒	hoge.py arg1
server2	2021年5月1日 9時52分0.868838秒	huga.py arg1 arg2 arg3
상태 관리에 따라 텍스트 파일로 간단하게 진행할 수 있습니다.
mmap 등 다양한 수단이 있지만, NFS에 있는 여러 서버 구조를 통합 처리하려면 파일을 기반으로 교환하는 게 좋을 것 같다.
코드는 아래와 같이 일반적인 장식물이다.
배타 자물쇠는 텍스트 파일의 줄마다 생존하는 과정에 대응한다.파이톤의finally에서 중간에 던진 스크립트가 죽었고 텍스트 파일의 상응하는 줄을 없애고 죽었다.
memoize_runnnig_processes.py
import os, sys, fcntl
from datetime import datetime
from pathlib import Path


def memoize_runnnig_processes(func):
    memory = Path("./.runnning-processes.txt")
    memory.touch()

    nodename = os.uname().nodename
    now = datetime.today().strftime('%Y年%-m月%-d日 %-H時%-M分%-S.%f秒')
    args = " ".join(sys.argv)
    l = f"{nodename}\t{now}\t{args}"

    def inner(*args, **kwargs):
        # add process status
        try:
            with memory.open("r+") as f:
                fcntl.flock(f, fcntl.LOCK_EX)

                lines = set(line.strip() for line in f.readlines() if line.strip())
                lines.add(l)
                lines = sorted(lines)

                f.truncate(0)
                f.seek(os.SEEK_SET)
                f.write("\n".join(lines))
                f.flush()

            return func(*args, **kwargs)

        # remove process status
        finally:
            with memory.open("r+") as f:
                fcntl.flock(f, fcntl.LOCK_EX)

                lines = set(line.strip() for line in f.readlines() if line.strip())
                lines.discard(l)
                lines = sorted(lines)

                f.truncate(0)
                f.seek(os.SEEK_SET)
                f.write("\n".join(lines))
                f.flush()

    return inner
.runnning-processes.txt 사전 제작은 가능하지만 touch하면 서류 없이 제작할 수 있어 편리하다.
파이톤의 시뮬레이터로 쓰지 않고 명령을 만드는 방침도 발전적으로 있다고 생각한다.memo python hoge.py처럼 움직일 수 있는 물건.시간 나면 하고 싶어요.
나는 더 좋은 방법이 있다고 생각한다. 무슨 일이 있으면 나에게 말해라🙏

좋은 웹페이지 즐겨찾기