没有STDOUT的两个python脚本之间的进程间通信

时间:2018-07-16 19:36:55

标签: python pipe ipc

我正在尝试创建一个Monitor脚本来监视所有线程或一个巨大的python脚本,该脚本正在运行多个记录程序,正在运行多个线程。

在Monitor.py中,我可以运行子进程并转发可能包含线程状态的STDOUT。.但是由于多个记录器正在运行,因此我看到了其他记录。

问题:如何在不干扰日志记录的情况下将主脚本作为一个单独的进程运行并获取自定义消息和线程状态。 (将PIPE作为参数传递?)

Main_Script.py *运行多个线程*每个线程都有单独的记录器。

Monitor.py *启动Main_script.py *监视MainScript.py中的每个线程(将来可能会从Main_script获取其他消息)

到目前为止,我尝试了多处理中的子流程。

子进程允许我启动Main_script并将标准输出转发回监视,但是我看到通过同一STDOUT进入的线程的日志记录。我正在使用“导入日志”库将每个线程中的数据记录到单独的文件中。

我尝试了多处理中的“过程”。我必须将main_script.py的主要功能作为进程调用,并从monitor.py向其发送PIPE参数。现在,当我运行top命令时,看不到Main_script.py是一个单独的过程。

1 个答案:

答案 0 :(得分:1)

通常,您希望将子进程更改为像典型的Unix用户态工具一样工作:日志记录和其他边带信息进入stderr(或文件,系统日志等),而只有实际输出进入标准输出。

然后,问题很容易:只需将stdout捕获到要处理的PIPE,然后将stderr捕获到另一个PIPE,或将其传递给真实的stderr


如果由于某种原因这不合适,则需要为IPC提供其他机制:Unix或Windows命名管道,通过在fork / {{1 }},然后将fd作为参数传递给Unix域套接字,TCP或UDP本地主机套接字,更高级别的协议,例如TCP套接字之上的Web服务,exec ped文件,匿名{{1} }或通过Unix域套接字或Windows API调用在进程之间传递的管道……

如您所见,有很多选择。除了想要“自定义消息”之外,不知道其他任何有关您问题的信息,就无法告诉您您想要哪个。

我们正在努力:如果您可以围绕mmap而不是mmap重写代码,则该模块内置了不错的高级抽象。例如,您可以使用multiprocessing来自动管理同步和阻塞,还可以管理酸洗/酸洗,因此您可以传递任何(可酸洗)对象,而不必担心序列化为文本和解析文本。或者,您可以创建共享内存,其中包含int32对象的数组,NumPy数组或用subprocess定义的任意结构。等等。当然,您可以自己构建相同的抽象,而无需使用Queue,但是当它们开箱即用时,它要容易得多。


最后,当您的问题被标记为ctypesmultiprocessing且标题为“进程间通信”时,您的描述是针对线程而不是进程。如果您实际上在单个进程中使用了一堆线程,则不需要任何一个。

您可以将结果粘贴在ipc上,或者将结果存储在pipe周围的queue.Queuelist中,或者将回调传递给调用每个新结果,或使用更高级别的抽象,例如deque并返回Lock对象或concurrent.futures.ThreadPoolExecutor s的迭代器,等等。