【问题标题】:Python Multiprocessing: Sending data to a processPython多处理:将数据发送到进程
【发布时间】:2010-10-21 05:34:26
【问题描述】:

我已经像这样子类化了Process

class EdgeRenderer(Process):
    def __init__(self,starter,*args,**kwargs):
        Process.__init__(self,*args,**kwargs)
        self.starter=starter

然后我定义了一个使用self.starterrun 方法。

starter 对象属于我定义的 State 类。

我可以这样做吗?对象会发生什么?它会被序列化吗?这是否意味着我必须始终确保 State 对象是可序列化的?新进程是否获得此对象的副本?

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    在 unix 系统上,多处理使用 os.fork() 创建子进程,在 Windows 上,它使用一些子进程技巧和序列化来共享数据。所以要跨平台,是的 - 它必须是可序列化的。孩子将获得一份新副本。

    话虽如此,这里有一个例子:

    from multiprocessing import Process
    import time
    
    class Starter(object):
        def __init__(self):
            self.state = False
    
    x = Starter()
    
    class EdgeRenderer(Process):
        def __init__(self,starter,*args,**kwargs):
            Process.__init__(self,*args,**kwargs)
            self.starter=starter
        def run(self):
            self.starter.state = "HAM SANDWICH"
            time.sleep(1)
            print self.starter.state
    
    a = EdgeRenderer(x)
    a.start()
    x.state = True
    a.join()
    print x.state
    

    运行时会看到:

    HAM SANDWICH
    True
    

    因此,在 fork() 之后,父级所做的更改不会得到传达,而子级所做的更改也有同样的问题。你必须遵守分叉限制。

    【讨论】:

    • 好的,我明白了。但这留下了一件奇怪的事情:当我以与传递starter 相同的方式传递队列时,它可以工作,所以我认为它不会被重复。那么为什么一个普通的对象会被复制而队列却没有呢?
    • 我假设您说的是 multiprocessing.queue,它的处理方式与其他对象不同,请查看:svn.python.org/view/python/trunk/Lib/multiprocessing/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多