簡體   English   中英

沒有STDOUT的兩個python腳本之間的進程間通信

[英]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 ,但是當它們開箱即用時,它要容易得多。


最后,雖然您的問題被標記為ipcpipe ,並且標題為“進程間通信”,但您的描述是針對線程而不是進程。 如果實際上在單個進程中使用了一堆線程,則不需要任何線程。

您可以將結果粘貼在queue.Queue ,或將它們存儲在list或在其周圍帶有Lock deque ,或者傳遞要在每個新結果中調用的回調,或使用更高級別的抽象(例如concurrent.futures.ThreadPoolExecutor並返回一個Future對象或一個迭代Future S等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM