0
我想知道爲什麼子進程打印出不同的對象地址。我也曾經和一位經理一起嘗試過,但並不影響結果。Python多處理:爲什麼對象實例沒有相同的地址?
import time
import multiprocessing as mp
class TestO:
def __init__(self, a):
self.a = a
def get_name(self):
return self.a
def run_task(tasks,nr):
obj = tasks[nr]['data']
print obj, obj.get_name()
if __name__ == "__main__":
tasks = dict()
a = TestO('first')
b = TestO('second')
tasks[1] = {'data': a}
tasks[2] = {'data': b}
process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1))
process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2))
process1.start()
time.sleep(0.2)
process2.start()
process1.join()
process2.join()
print a, 'first'
print b, 'second'
這會給結果
<__main__.TestO instance at 0x02EFD2D8> first
<__main__.TestO instance at 0x0373D300> second
<__main__.TestO instance at 0x043663C8> first
<__main__.TestO instance at 0x043663F0> second
是情況下被複制?有沒有辦法保持同一個實例?我遇到了上述類對象更復雜的更復雜版本的問題。在這種情況下得到的結果是,我在對象實例上設置的值在輸入mp.Process
後無效,即obj.get_name
返回None
。
我將如何使用我提供的示例使用共享內存?我認爲使用管理器將與共享內存相同,但在這種情況下我也獲得了不同的地址。 – Chicony
我可能會錯,但由於GIL阻止真正的共享內存,是不是'mp.Process'序列化的參數? – erip
@Chicony:如果您使用管理器,您可以獲得共享,但由於「虛擬內存」,地址仍然會有所不同。閱讀虛擬內存,你會看到。僅僅因爲有兩件事情生活在兩個不同的虛擬地址,並不能告訴你它們是否是同一個實例,當你談論兩個不同的過程時。 –