如何通过多处理获取变量的进程间唯一键。进程?
我已尝试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)
,但他们没有共享变量。
答案 0 :(得分:0)
id和内存地址(在CPython中相关)仅在单个进程中有意义。你不能按照你的方式使用它们。如果您需要一些识别信息,您必须自己创建它并将其放入您正在共享的对象中。
话虽如此,你并没有分享任何对象。将普通对象作为参数传递给multiprocessing.Process
时,它只会为每个进程创建一个副本,并且不会共享任何更改。
在进程之间发送数据的最简单方法是将其推送到队列中,但如果您确实需要共享可变对象,multiprocessing
中有一些特殊类允许这样:Value
和{ {1}}表示简单值,Array
表示更复杂的对象。
即:
Manager
有关详细信息和一些使用它们的简单示例,请参阅https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes。