系统相关
首页 > 系统相关> > python-无需物理移动即可在进程之间共享数据

python-无需物理移动即可在进程之间共享数据

作者:互联网

我有一份工作,可以完成很多单独的任务.对于每个任务,我需要下载一些数据,对其进行处理,然后再次上传.

我正在使用多处理池进行处理.

我有几个我不确定的问题.

首先,数据大约可以达到20MB,理想情况下,我希望将其移至子工作进程,而无需将其物理移动到内存中,也可以将结果数据也移回父进程,而无需移动.由于我不确定某些工具如何在后台运行,我不知道是否可以将数据作为参数传递给池的apply_async(据我了解,它会序列化对象,然后在到达子流程?),或者是否应该使用多处理队列或mmap?或者是其他东西?

我看了ctypes objects,但据我了解,只有可以共享流程派生时创建池时定义的对象?这对我没有好处,因为我将不断需要共享新数据.

我不需要担心的一件事是对数据的任何并发访问,因此我不需要任何类型的锁定.这是因为仅在下载数据后才开始处理,并且也仅在生成输出数据后才开始上传.

我遇到的另一个问题是,有时进来的任务可能会激增,结果,我下载任务数据的速度比子进程可以处理的速度更快.因此,我下载数据的速度快于完成任务和处理数据的速度,而python快要死于内存不足.当内存快满了/作业管道中有太多数据时,在下载阶段暂缓任务的一个好方法是什么?
我在考虑通过使用数据字节数来进行某种类型的“引用”计数,因此我可以限制下载和上传之间的数据量,并且仅在数量低于某个阈值时才下载.尽管我担心一个孩子有时可能会失败,而且我永远也不会拿走它所拥有的数据.是否有实现这种事情的好方法?

解决方法:

(这是我先前回答的讨论结果)

您是否尝试过POSH

此示例说明可以将元素追加到可变列表中,这可能是您想要的(从documentation复制):

import posh

l = posh.share(range(3))
if posh.fork():
    #parent process
    l.append(3)
    posh.waitall()
else:
    # child process
    l.append(4)
    posh.exit(0)
print l

-- Output --
[0, 1, 2, 3, 4]
  -- OR --
[0, 1, 2, 4, 3]

标签:multiprocessing,shared-memory,python
来源: https://codeday.me/bug/20191031/1977297.html