2015-06-12 1 views
0

Я хочу контролировать значение в заданном потоке из другого процесса. Следующее не работает, поскольку 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) 

UPDATE

Вторая попытка, которая также не работает.

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

Извините, что здесь происходит? единственный простой способ обмена данными между двумя процессами - использовать разделяемую память (если вы хотите указать только события, которые могут вам помочь). Также почему вы настаиваете на смешивании потоков с многопроцессорностью (знаете ли вы о GIL)? – user3012759

+0

@ user3012759 Нет ничего плохого в том, что процесс имеет свои собственные потоки. Я не использую события, которые я использую диспетчер общей памяти. – Baz

ответ

1

вы получили

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

, который будет оценивать при создании нити, так что аргумент вашего потока будет только ваша неизменная строкой и отваливается от менеджера

если вы хотите изменить его позже, вы хотите передать свой dproxy не элемент его.

EDIT: Хорошо, так что, посмотрев на него немного больше, кажется, что вы нажимаете на возможный bug, который предотвращает правильную работу вложенных прокси-серверов, поскольку кажется, что как только вы вставляете прокси-сервер, он получает «de-proxied» и вы получаете простое значение.

В вашем втором примере, однако, вы можете просто изменить из manager.dict() в простой dict() как вы не использовать его в любом случае, но это сломается, если вы на самом деле пытаются модифицировать dict себя, но будет работать на values, как они будут приходят в ваши потоки как объекты-прокси и получат тот факт, что они модифицируются с использованием .set

+0

@dproxy Я не хочу передавать словарь для каждой функции потока, так как они должны интересоваться только одним значением. Я попробовал добавить прокси-объекты Value в свой словарь-прокси, а затем я сбросил один из этих значений, но опять-таки значение не было обновлено в соответствующем потоке. – Baz

+0

Можете ли вы показать код для этого, может быть? потому что для его работы вам нужно передать прокси-сервер в свой поток, как только вы передадите значение напрямую, вы потеряете прокси-часть, и она просто отвалится от менеджера. – user3012759

+0

Добавлено в мой вопрос. – Baz

Смежные вопросы