用python多进程模块multiprocessing创建的子进程如何共享内存空间?

网上看到很多方法有Manager,Array等等,但是我想传递的是python中的一个自建类的对象,应该如何实现?比如importmultiprocessingasmcl... 网上看到很多方法有Manager,Array等等,但是我想传递的是python中的一个自建类的对象,应该如何实现?

比如
import multiprocessing as m
class Person:
def __init__(self,name):
self.name=name
def report(person):
print(person.name)
person=Person('steve')
p=m.Process(target=report,args=(person,))
p.start()
没有任何反应。为什么?
展开
 我来答
bdwisyou7d
2013-07-07 · TA获得超过1.3万个赞
知道大有可为答主
回答量:3774
采纳率:81%
帮助的人:1083万
展开全部
进程传递数据最简单方便的是通过Queue。这样你的自建类对象就可以放到队列中,由子进程获取。

到于Array, Var等方法,那是给高效数据共享用的。共享内存是进程通信的高级技巧。需要高性能计算的时候再研究这些方法。

Pool, Manager之类是一种封装。用得反而比较少。

python与C++共享内存里,还会使用一种Numpy中的数组。那个效率更高。

你的程序中子进程及传递参数都没有问题。你少了一句。在后面要加上
p.join()就可以了

如果不加,那么你的主进程不等子进程,它先退出了,往往操作系统会自动把子进程也杀掉。

另外子进程中的print输出有延时。即使你用sys.stdout.flush(),有时候它也会有延时。
追问
仍然没有反应啊。。
追答

你不要在IDLE里调试多进程程序,没有用的。还容易误判。要在命令行下直接运行。

import multiprocessing as m
import sys
class Person:
    def __init__(self,name):
        print "init"
        self.name=name
def report(person):
    print "report"
    print(person.name)
    sys.stdout.flush()
def main():
    person=Person('steve')
    p=m.Process(target=report,args=(person,))
    p.start()
    print "wait"
    p.join()
    print "end"
if __name__=="__main__":
    main()
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式