[英]Interprocess Communication between two python scripts without STDOUT
我正在嘗試創建一個Monitor腳本來監視所有線程,或者一個巨大的python腳本,其中運行着幾個記錄器,幾個線程正在運行。
從Monitor.py,我可以運行子進程並轉發可能包含線程狀態的STDOUT。.但是由於多個記錄程序正在運行,因此我看到了其他日志記錄。
問題:如何將主腳本作為一個單獨的進程運行,並在不干擾日志記錄的情況下獲取自定義消息和線程狀態。 (將PIPE作為參數傳遞?)
Main_Script.py *運行多個線程*每個線程都有單獨的記錄器。
Monitor.py *旋轉Main_script.py *監視MainScript.py中的每個線程(將來可能會從Main_script獲得其他消息)
到目前為止,我嘗試了子進程,即來自Multiprocessing的進程。
子進程允許我啟動Main_script並將標准輸出轉發回監視,但是我看到通過同一STDOUT進入的線程的日志記錄。 我正在使用“導入日志”庫將每個線程中的數據記錄到單獨的文件中。
我嘗試了多處理中的“過程”。 我必須將main_script.py的主要功能作為進程調用,並從monitor.py向其發送PIPE參數。 現在,當我運行top命令時,看不到Main_script.py是一個單獨的進程。
通常,您希望將子進程更改為像典型的Unix用戶態工具一樣工作:日志記錄和其他邊帶信息進入stderr(或進入文件或syslog等),而只有實際輸出進入stdout 。
然后,問題就很容易了:只需將stdout
捕獲到您要處理的PIPE
,然后將stderr
捕獲到其他PIPE
,或者將其傳遞到實際的stderr
。
如果由於某些原因這不合適,則需要為IPC提供其他機制:Unix或Windows命名管道,通過在fork
/ exec
泄漏文件描述符傳遞的匿名管道,然后將fd作為參數傳遞, Unix域套接字,TCP或UDP本地主機套接字,更高級別的協議,例如TCP套接字之上的Web服務, mmap
ped文件,匿名mmap
或通過Unix域套接字或Windows API調用在進程之間傳遞的管道,…
如您所見,有很多選擇。 除了想要“自定義消息”之外,不知道其他任何有關您問題的信息,就無法告訴您您想要哪一個。
當我們在討論它時:如果您可以圍繞multiprocessing
而不是subprocess
重寫代碼,則該模塊內置了不錯的高級抽象。 例如,您可以使用自動管理同步和阻止以及管理酸洗/酸洗的Queue
,以便您可以傳遞任何(可酸洗)對象,而不必擔心序列化為文本和解析文本。 或者,您可以創建共享內存,其中包含int32對象數組,NumPy數組或使用ctypes
定義的任意結構。 等等。 當然,您可以自己構建相同的抽象,而無需使用multiprocessing
,但是當它們開箱即用時,它要容易得多。
最后,雖然您的問題被標記為ipc
和pipe
,並且標題為“進程間通信”,但您的描述是針對線程而不是進程。 如果實際上在單個進程中使用了一堆線程,則不需要任何線程。
您可以將結果粘貼在queue.Queue
,或將它們存儲在list
或在其周圍帶有Lock
deque
,或者傳遞要在每個新結果中調用的回調,或使用更高級別的抽象(例如concurrent.futures.ThreadPoolExecutor
並返回一個Future
對象或一個迭代Future
S等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.