如何获得唯一键值来区分python multiprocessing.Process之间的变量?

时间:2015-10-19 12:17:08

标签: python multiprocessing

如何通过多处理获取变量的进程间唯一键。进程?

我已尝试id(variable),或在eclipse调试模式下寻址(例如A: <__main__.A object at 0x1ca9990>

然而,他们似乎并没有区分变量而不是过程。

检查变量是否按照我想要的方式共享。

这是我的测试代码

class A(object):

    def __init__(self):

        self.variable = {'num' : 0}

def Rx(a):
    time.sleep(1)
    while 1:
        time.sleep(2)
        print "RX(id):", id(a.variable)
        print "RX:", a.variable

def Tx(a):
    while 1:
        time.sleep(2)
        print "TX(id):", id(a.variable)
        a.variable['num'] += 1
        print "TX:", a.variable

if __name__ == '__main__':
    a = A()

    rx = multiprocessing.Process(target=Rx, args=(a,))
    tx = multiprocessing.Process(target=Tx, args=(a,))

    rx.start()
    tx.start()

这是输出

TX(id): 33912768
TX: {'num': 1}
RX(id): 33912768
RX: {'num': 0}
TX(id): 33912768
TX: {'num': 2}
RX(id): 33912768
RX: {'num': 0}
TX(id): 33912768
TX: {'num': 3}
RX(id): 33912768
RX: {'num': 0}
TX(id): 33912768
TX: {'num': 4}

虽然他们(流程)打印相同的id(a.variable),但他们没有共享变量。

1 个答案:

答案 0 :(得分:0)

id和内存地址(在CPython中相关)仅在单个进程中有意义。你不能按照你的方式使用它们。如果您需要一些识别信息,您必须自己创建它并将其放入您正在共享的对象中。

话虽如此,你并没有分享任何对象。将普通对象作为参数传递给multiprocessing.Process时,它只会为每个进程创建一个副本,并且不会共享任何更改。

在进程之间发送数据的最简单方法是将其推送到队列中,但如果您确实需要共享可变对象,multiprocessing中有一些特殊类允许这样:Value和{ {1}}表示简单值,Array表示更复杂的对象。

即:

Manager

有关详细信息和一些使用它们的简单示例,请参阅https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes