在给定线程中更改状态形成另一个进程
Changing state in a given thread form another process
我希望从另一个进程控制给定线程中的值。以下不起作用,因为 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)
你有
t = threading.Thread(target=g, args=(dproxy[i],))
这将在创建线程时进行评估,因此线程的参数将只是您的不可变字符串,并且从管理器中脱落
如果你想稍后更改它,你想传递你的 dproxy
而不是它的元素。
编辑:好的,所以在进一步研究之后,您似乎遇到了一个可能的 bug,它会阻止嵌套代理正常工作,因为看起来一旦您嵌套代理它就会得到 'de-proxied',你最终得到的是普通价值。
然而,在您的第二个示例中,您可以从 manager.dict()
更改为普通 dict()
,因为您无论如何都不使用它,但是如果您实际尝试修改 dict
本身,但会为 values
工作,因为它们将作为代理对象到达您的线程,并且会发现使用 .set
修改它们的事实
我希望从另一个进程控制给定线程中的值。以下不起作用,因为 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)
你有
t = threading.Thread(target=g, args=(dproxy[i],))
这将在创建线程时进行评估,因此线程的参数将只是您的不可变字符串,并且从管理器中脱落
如果你想稍后更改它,你想传递你的 dproxy
而不是它的元素。
编辑:好的,所以在进一步研究之后,您似乎遇到了一个可能的 bug,它会阻止嵌套代理正常工作,因为看起来一旦您嵌套代理它就会得到 'de-proxied',你最终得到的是普通价值。
然而,在您的第二个示例中,您可以从 manager.dict()
更改为普通 dict()
,因为您无论如何都不使用它,但是如果您实际尝试修改 dict
本身,但会为 values
工作,因为它们将作为代理对象到达您的线程,并且会发现使用 .set