2017-05-06 69 views
1

我試圖做一個程序,要求用戶輸入和閱讀器功能打印輸入沒有輸入功能阻止閱讀器功能。監控多進程

這裏我可以做什麼

import multiprocessing as mp 
import time 


def ProInput(queue): 
    while True: 
     if queue.empty(): 
      print("{} waiting an item".format(mp.current_process().name)) 
     else: 
      item = queue.get() 
      if(item == 'exit'): 
       break; 
      else: 
       print("{} processing {}".format(mp.current_process().name, item)) 
     time.sleep(1) 



def InputRead(queue): 
    while True: 
     f = input("Insert your input :") 
     queue.put(f) 
     if(f == 'exit'): 
      break; 
     print("You insert {} into the system".format(f)) 

if __name__ == '__main__': 
    st = time.time() 
    q = mp.Queue() 

    OutputSys = mp.Process(target=ProInput, name='Reader', args=(q,)) 
    OutputSys.daemon = True 
    OutputSys.start() 

    InputRead(q) 

    et = time.time() 
    OutputSys.join() 
    print('Total running time {}'.format(et-st)) 

那是什麼辦法,使在第一終端和其他終端閱讀器功能的輸入功能?我的意思是,我可以在不受閱讀器功能干擾的情況下輸入內容。 My Program Looks like

FAQ

問:你爲什麼不刪除打印功能的閱讀器?你的問題解決了!答:我需要監視程序中的進程。

Ps。 :隨時糾正我的語法,因爲我的英語仍然崩潰。

回答

0

請澄清你的意思,說「另一個終端」。多處理本身不涉及終端(TTY/PTY)分配或管理,並且對於具有多個用戶可訪問終端的進程而言有點不尋常。

如果我正確理解你的問題,你基本上希望你的程序被監控(健康檢查)。有兩種常用的一般方法是:

  • 如果你需要的是輸出狀態信息的地方,考慮寫一些日誌(如文件,系統日誌或一些UDP套接字 - 考慮使用logging模塊,因爲它是非常靈活)。然後設置您的監控解決方案將會觀察日誌文件(或者在套接字上監聽新消息)並作出相應的反應。

    I.e.而不是print做這樣的事情:

    import logging 
    
    def setup_logger(): 
        # Just a very primitive example. Not a good code. 
        logger = logging.getLogger("proinput") 
        logger.setLevel(logging.DEBUG) 
        # Or `fh = logging.StreamHandler(sys.stdout)` 
        # to get the same effect as your previous print calls 
        fh = logging.FileHandler("proinput.log") 
        fh.setLevel(logging.DEBUG) 
        formatter = logging.Formatter(
         "[%(asctime)s] %(process)d[%(processName)s] " 
         "%(name)s (%(funcName)s): %(levelname)s: %(message)s" 
        ) 
        fh.setFormatter(formatter) 
        logger.addHandler(fh) 
        return logger 
    
    def pro_input(queue): 
        logger = setup_logger() 
        while True: 
         ... 
         logger.info("Waiting for an item") 
         ... 
         logger.info("Processing: %s", repr(item)) 
    

    上面的例子是非常原始的,死板,不會很好地擴展。查看logging documentation(特別是教程和關於configuring logging的部分 - 這就是我說的日誌是靈活的)和a question on using logging with multiprocessing以獲取更多信息。

    如果你真的想擁有兩個終端,這種方法還可以讓你的「多終端」的情況。只需使用預先創建的終端設備(例如,打開一個新的控制檯窗口,運行tty,它會輸出類似/dev/pts/9的內容)作爲輸出文件,並在通過命令行選項或環境變量啓動程序時傳遞此信息。

  • 另一種選擇是實現一個特殊的服務器(例如HTTP或簡單的TCP),它允許監視軟件連接和查詢狀態。這個想法是在你的程序中有一個獨立的進程,專門爲外部世界提供狀態信息。

    對於像您這樣的交互式軟件,這種情況並不常見,但對於服務器來說,這是一種非常流行的方法,可以實施健康檢查。如果您的軟件是「無頭」,用戶輸入只是用於原型設計,請考慮檢查Prometheus。它有一個很好的儀器庫,可以通過HTTP輕鬆測量和輸出數據。

您選擇哪種方式(被動觀看vs主動查詢)取決於您的監控解決方案和您的個人偏好。

+0

嗯,非常感謝您的回答。它確實有幫助。 –