在python子进程之间共享对象

时间:2019-08-26 15:08:34

标签: python object subprocess

我实际上正在处理一个Python脚本,该脚本中有一个字典列表,然后使用一个子进程来运行另一个Python脚本。

在这样的第二个脚本中,我需要访问第一个脚本中存在的相同词典列表,所以到目前为止,我一直在执行以下操作:

  • 将字典列表转储为JSON格式的文件
  • 将文件的路径作为子进程的输入参数
  • 从第二个脚本中的文件中检索(加载)字典列表

但是,转储和加载是非常慢的I / O操作,尤其是对于大文件,因此我想知道是否存在另一种直接在内存中与第二个脚本共享这样的词典列表的方法。

2 个答案:

答案 0 :(得分:1)

据我所知,您不能在使用子流程模块时使用,但是改用多处理进行重写和重组(如果可行)将允许您使用https://docs.python.org/3.7/library/multiprocessing.html#sharing-state-between-processes

中的选项

但是,请注意,由于锁定开销等存在很高的风险,这会影响性能,因此它可能比复制数据要慢。如果要优化复制,请考虑使用pickle而不是json进行序列化。

答案 1 :(得分:1)

您可以使用管道在不同程序/进程之间建立通信链接。这样,您就可以在它们之间传递消息而无需写入光盘。

并且,为了使事情变得更好,在主流程及其子流程stdinstdout之间已经存在一对管道。因此,在启动子流程时,请确保将stdin重新路由到管道,您将有一种方法可以直接写入子流程:subprocess.call([subprogram], stdin=subprocess.PIPE ...)

当然,子进程/程序必须能够处理该链接上的输入,而不是从光盘中读取。我认为这是实现您想要的目标的最干净,最简单的方法,但前提是我从未尝试过Jython的方法。