在给定线程中更改状态形成另一个进程

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

修改它们的事实