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

时间:2015-06-12 08:27:53

标签: python python-multiprocessing

我希望控制来自另一个进程的给定线程中的值。以下不起作用,因为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)

1 个答案:

答案 0 :(得分:1)

你有

t = threading.Thread(target=g, args=(dproxy[i],))

将在创建线程时进行评估,因此您的线程的参数将只是您的不可变字符串并且从管理器中脱落

如果你想稍后更改它,你想传递你的dproxy而不是它的一个元素。

编辑:好的,所以在仔细研究之后,看起来你正在点击一个可能的bug来防止嵌套代理正常工作,因为看起来只要你嵌套一个代理它就会得到&#39 DE-代理'你最终会得到普通的价值。

在你的第二个例子中,你可以从manager.dict()更改为普通dict(),因为你还没有使用它,但如果你真的试图修改{{{} 1}}本身,但适用于dict,因为它们将作为代理对象到达您的线程,并将使用values

获取修改它们的事实