我希望控制来自另一个进程的给定线程中的值。以下不起作用,因为dproxy[i]
是值而不是代理。我该怎么做?
import multiprocessing
import time
import threading
def g(d):
while d:
print(d)
time.sleep(1)
def f(dproxy):
for i in ("1","2"):
t = threading.Thread(target=g, args=(dproxy[i],))
t.daemon = True
t.start()
time.sleep(10)
manager = multiprocessing.Manager()
dproxy = manager.dict()
dproxy["1"] = "A"
dproxy["2"] = "B"
p = multiprocessing.Process(target=f, args=(dproxy,))
p.daemon = True
p.start()
time.sleep(2)
dproxy["1"] = "C"
time.sleep(2)
更新
第二次尝试也没有效果。
import multiprocessing
import time
import threading
def g(d):
while d:
print(d)
time.sleep(1)
def f(dproxy):
print(type(dproxy["1"]))
for i in ("1","2"):
t = threading.Thread(target=g, args=(dproxy[i],))
t.daemon = True
t.start()
time.sleep(10)
manager = multiprocessing.Manager()
dproxy = manager.dict()
dproxy["1"] = manager.Value("s","A")
dproxy["2"] = manager.Value("s","B")
p = multiprocessing.Process(target=f, args=(dproxy,))
p.daemon = True
p.start()
time.sleep(2)
dproxy["1"].set("C")
time.sleep(2)
答案 0 :(得分:1)
你有
t = threading.Thread(target=g, args=(dproxy[i],))
将在创建线程时进行评估,因此您的线程的参数将只是您的不可变字符串并且从管理器中脱落
如果你想稍后更改它,你想传递你的dproxy
而不是它的一个元素。
编辑:好的,所以在仔细研究之后,看起来你正在点击一个可能的bug来防止嵌套代理正常工作,因为看起来只要你嵌套一个代理它就会得到&#39 DE-代理'你最终会得到普通的价值。
在你的第二个例子中,你可以从manager.dict()
更改为普通dict()
,因为你还没有使用它,但如果你真的试图修改{{{} 1}}本身,但适用于dict
,因为它们将作为代理对象到达您的线程,并将使用values