【lab】常規操做:log寫法,運行和數據信息管理,測試管理,多線程/進程tips

第一個問題:

「你寫log了沒?」python

第二個問題:

「你寫log了沒?」git

第三個問題:

「你寫log的時間到一個小時了沒?沒有的話再去寫log」shell


log:

log密度: 大概每100行有10個 -- 由於平均每一百行code會產生10個左右潛在的關鍵節點(同時100行可能有6-8個bug點)。log多多益善,以前的努力是以後的欣慰。bash

從coding的角度講,永遠避免寫暫時的code,包括繪圖的code,處理數據的code,超過30行就要考慮打包而且寫詳細的文檔。若是超過10個函數,考慮生成大文檔。編輯器

熟練掌握全部工具語言的輸入輸出I/O函數。分佈式

天天可能產生上千行的log。爲了不混亂,全部當天的log都dump到一個或者多個只以日期命名的文件中。
請熟練運用各類命令行文檔查找,編輯器regex查詢,以及寫Python腳本提取單個task的log片斷。函數

  • log風格

Python:工具

臨時:測試

print("a has been incremented 1. \n", file="log.txt")

集中管理:命令行

from time import localtime, strftime

def log(msg="", mute=0):
      print(msg, file="log_%s.txt" % strftime("%b%d_%H%M%S", localtime()))

# "%b%d_%H%M%S ": 'Mar20_150921'
  • 模板
LOG FILE FOR DATE: 03/19/2019

==========================
time start: %s

task: %s

source code file: %s

output files:

==========================

time hh:MM:ss:  (checkpoint)

                    (stdout, stderr)

time hh:MM:ss: (checkpoint)


                    (stdout, stderr)

...


==========================
time start: %s

task: %s

source code file: %s

output files:

==========================


time hh:MM:ss: (checkpoint)


                    (stdout, stderr)

定時開始

  • bash
echo "python run.py" | at 4:00

atq   # get job ids

at -d <job-id> # cancel job

數據信息(time stamp, entries, method, notes, etc)

任何分佈式環境都適用的一個風格:每一個文件保存本身的header,而不是用一箇中央索引來整合和記錄。

所以最有效的整合零散實驗數據的方法,是在每個的首行記錄詳細信息,而且標註好各個數據項。

測試

命名一概:test_

方便git提交的時候寫入.gitignore

多進程/線程長時間運行

  • 將須要運行的參數保存在一個外部文件,而不是臨時寫在代碼裏。(待實踐)

  • 若是對參數沒有事先要求/偏好, e.g. 採起地毯式搜索最優參數,能夠將參數亂序後分配給不一樣的進程/線程而不是順序分配,這樣任什麼時候刻獲得的數據都有必定表明性

  • 保存參數運行信息,查看具體參數運行時間,估計整體運行時間。在運行函數中加入如下語句將參數的開始運行和結束時間輸出到文件:

def run():  # the func to be run by each thread/process
    with open("log.txt", "a+") as f:
        f.write("params  <params> begin at <time stamp sec>\n")

        ...
    with open("log.txt", "a+") as f:
        f.write("params  <params> finish at <time stamp sec>\n")

而後對文件進行清理:

import re
import time
import sys

sys.stdout = open("log/running_log_clean%d.txt" % time.time())


# ['MK', 'batch_all', './log/%s2019_%sNetwork_%s_core%s.txt', (1, 0), 3, 1000, 2, 50, (0.1, 0.6), 0.02, 0.12000000000000001]

param_text = re.compile(r"\[.+\]")

param_dic = dict()
with open("log/running_log.txt", 'r') as f:
    line = f.readline()
    
    while line:
        param_raw = re.findall(param_text, line)[0]
        param_dic.setdefault(param_raw, dict())

        if param_raw:
            if re.findall(r"begin", line):
                param_dic[param_raw]["start_time"] = re.findall(r'1553......', line)[0]  # year 2019
            elif re.findall(r"finish", line):
                param_dic[param_raw]["end_time"] = re.findall(r'1553......', line)[0]
                print("param %s finish in %d secs", param_raw, param_dic[param_raw]["end_time"] - param_dic[param_raw]["start_time"])
            else:
                print("param %s running for %d secs", param_raw, round(time.time()) - param_dic[param_raw]["start_time"])

        line = f.readline()
from multiprocessing import Process
import os
import sys

def info(title):
    print title
    print 'module name:', __name__
    print 'parent process:', os.getppid()
    print 'process id:', os.getpid()

def f(name):
    sys.stdout = open(str(os.getpid()) + ".out", "w")
    info('function f')
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    q = Process(target=f, args=('fred',))
    q.start()
    p.join()
    q.join()

# output
'''
$ ls
m.py
$ python m.py
$ ls
27493.out  27494.out  m.py
$ cat 27493.out 
function f
module name: __main__
parent process: 27492
process id: 27493
hello bob
$ cat 27494.out 
function f
module name: __main__
parent process: 27492
process id: 27494
hello fred

'''
相關文章
相關標籤/搜索