在 python 子进程之间共享对象



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

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

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

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

您可以使用管道在不同程序/进程之间设置通信链接。这将允许您在不写入光盘的情况下在它们之间传递消息。

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

当然,子进程/程序必须能够通过该链接处理输入,而不是从光盘读取。我认为这是实现你想要的最干净,最简单的方法,只要它适用于Jython,我从未尝试过。

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

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

最新更新