多進程打印日誌

多進程的日誌和多線程的日誌有一點區別。原因是 Python 的 logging 包不支持進程共享鎖,所以來自不同的進程的日誌可能會混在一起。我們嘗試一下在上邊的例子里加一個基礎日誌。下邊是代碼:

import loggingimport multiprocessingfrom multiprocessing import Process, Lockdef printer(item, lock):
    """    Prints out the item that was passed in    """
    lock.acquire()
    try:
        print(item)
    finally:
        lock.release()if __name__ == '__main__':
    lock = Lock()
    items = ['tango', 'foxtrot', 10]
    multiprocessing.log_to_stderr()
    logger = multiprocessing.get_logger()
    logger.setLevel(logging.INFO)
    for item in items:
        p = Process(target=printer, args=(item, lock))
        p.start()

記錄日誌最簡單的方法是將所有的日誌發送給 stderr 。我們可以通過調用函數 log_to_stderr 來實現。然後我們調用 get_logger 函數得到記錄器(logger),並把日誌級別設置爲 INFO。剩下的代碼和原來一樣。這裏要說明一下,我並沒有用 join() 函數。相反, 父線程在退出的時候要顯式地調用 join()

當你運行上邊的代碼,會得到像下面這樣的輸出:

[INFO/Process-1] child process calling self.run()
tango
[INFO/Process-1] process shutting down
[INFO/Process-1] process exiting with exitcode 0
[INFO/Process-2] child process calling self.run()
[INFO/MainProcess] process shutting down
foxtrot
[INFO/Process-2] process shutting down
[INFO/Process-3] child process calling self.run()
[INFO/Process-2] process exiting with exitcode 0
10
[INFO/MainProcess] calling join() for process Process-3
[INFO/Process-3] process shutting down
[INFO/Process-3] process exiting with exitcode 0
[INFO/MainProcess] calling join() for process Process-2

現在你如果想把日誌保存到硬盤,其實還有有些複雜的。你可以參考 Python 的官方實例


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章