繁体   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