ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-10-31 16:58:58  阅读:217  来源: 互联网

标签:multiprocessing shared-memory 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有