2016-09-21 63 views
1

我正在编写一个多处理进程,以监视其状态。我如何从上下文访问my_var?访问全局变量以跟踪多处理中的状态

from multiprocessing import Process 
import time 

my_var = list() 


def alter_my_var(): 
    global my_var 
    for x in range(10): 
     my_var.append(x) 
     time.sleep(1) 

p = Process(target=alter_my_var) 
p.start() 

while p.is_alive(): 
    print "Length of my_var is %i" % len(my_var) 
    time.sleep(1) 

p.join() 

print "Done - final length of my_var is %s" % len(my_var) 

感谢

+1

进程不是线程; “线程”这个词不适用于这个问题。 –

+0

谢谢@CharlesDuffy,我很抱歉错误的措词。 – dmcmulle

+0

@dmcmulle,线程和进程是两个完全不同的东西,你会在你的代码中实际做什么? –

回答

2

您使用multiprocessingthreading。进程运行在不同的内存空间,变量被复制到子进程,但他们不再指向同一个内存地址。因此,您在进程中修改的内容不能被主进程读取。

如果你不在乎它是一个过程还是线程,请尝试通过Thread更改Process,它将起作用。

输出

Length of my_var is 0 
Length of my_var is 1 
Length of my_var is 2 
Length of my_var is 3 
Length of my_var is 4 
Length of my_var is 6 
Length of my_var is 7 
Length of my_var is 8 
Length of my_var is 9 
Length of my_var is 10 
Done - final length of my_var is 10 

编辑

至于其他人说,如果你想使用的过程,让你必须建立某种形式的IPC的。您可以使用该队列,经理等。

+1

谢谢。这是我正在寻找的。欢迎并感谢您在流程和线程之间的不同解释。 – dmcmulle

+0

请注意,python线程使用与主线程相同的CPU。如果你想在线程中执行一些CPU密集型工作,你应该使用进程。如果你想做的事情很简单,或者I/O操作,线程都可以。 – edgarstack

1

使用Manager,每个进程得到列表的副本,这样你就不能共享一个对象,具有经理()名单()你:

from multiprocessing import Process, Manager 
import time 

my_var = Manager().list() 

def alter_my_var(my_var): 
    for x in range(10): 
     my_var.append(x) 
     time.sleep(1) 

p = Process(target=alter_my_var, args=(my_var,)) 
p.start() 
while p.is_alive(): 
    print "Length of my_var is %i" % len(my_var) 
    time.sleep(1) 
p.join() 
print "Done - final length of my_var is %s" % len(my_var) 

如果我们将代码粘贴到Ipython中,您可以看到输出:

## -- End pasted text -- 
Length of my_var is 0 
Length of my_var is 1 
Length of my_var is 3 
Length of my_var is 4 
Length of my_var is 5 
Length of my_var is 6 
Length of my_var is 7 
Length of my_var is 8 
Length of my_var is 9 
Length of my_var is 10 
Done - final length of my_var is 10 
+0

你可能仍然想通过'my_var'作为参数。 – 101

0

试试这个:

from multiprocessing import Process, Pipe 
import time 

my_var = list() 


def alter_my_var(my_var, conn): 
    for x in range(10): 
     my_var.append(x) 
     conn.send(len(my_var)) 
     time.sleep(1) 

global my_var 
parent_conn, child_conn = Pipe() 
p = Process(target=alter_my_var, args=(my_var,child_conn,)) 
p.start() 

while p.is_alive(): 
    myvar_len = parent_conn.recv() 
    print "Length of my_var is %i" % myvar_len  
    time.sleep(1) 

p.join() 

print "Done - final length of my_var is %s" % myvar_len