2013-08-26 134 views
0

随着剧本上焦点理解为什么多线程无法读取全局变量

T0 =了time.time()##定义这个全局变量是全球

这个功能

DEF时间戳(T0):
...返回( “[” + STR(了time.time() - T 0)+ “]”)##从时间初始启动

冲压

我想我的时间戳脚本的每个打印()与

打印(时间戳(T0)+ “” ...什么... “”)

这工作,但是当我被

在范围的thread_id enterring多线程(Win32的safe_os):
... p =处理(目标= fonction,ARGS =((的thread_id), “测试” ))
... p.start()
... thread_list.append(P)

为了

DEF fonction(的thread_id,filetodo):
...打印(timestamp(t0)+“加载核心”+ str(thread_id))
... print(timestamp(t0)+ str(filetodo)+“on core”+ str(thread_id))
... print (timestamp(t0)+“Free core”+ str(thread_id))

我得到这个标准输出:

[2.70299983025] 297 JPG/36087文件
[2.75] Enterring多线程
[2.75]的Win32发现:2芯(S)
[0.0]负载核心0
[0.0]关于核心试验0
[0.0]免费核心0
[0.0]负载芯1
[0.0]于核心试验1
[0.0]免芯1

我可以看到,我的呼叫到时间戳()并且t0正在工作,但不在p.start()中。我想知道如何(以及为什么)我需要纠正?

PS:我试图与time.clock,但在Win32中是指一个线程(不是脚本)的开始/

+1

只是想指出你正在创建一个新的进程,而不是一个新的线程。 –

+1

您应该使用代码块而不是代码块。用4个空格缩进每个代码块。或者选择块并按下CTRL + K。 –

+0

线程(同一进程)在共享内存空间中运行,而进程在单独的内存空间中运行。 < - 好的,我明白了...... THX GREG! –

回答

2

每个进程都有全局变量的一个单独的实例。如果您希望每个进程看到相同的值,则需要将该值作为参数传递给每个进程。

+0

每个进程都有一个单独的全局变量实例。 < - 我不明白变量的“全局”,所以。谢谢。 –

+0

是的!完全正确。答案就是在这个问题上,实际上是“def timestamp(t0):”......你让大卫岩石化! –

0

下面的代码:

import time 
from multiprocessing import Process 

t0 = time.time() ## is global 

def timestamp(t0): 
    return ("[" + str(time.time()-t0)+ "] ") ## time stamping from initial start 

def fonction(thread_id, filetodo): 
    print(timestamp(t0)+"Load core "+str(thread_id)) 
    print(timestamp(t0)+str(filetodo)+" on core "+str(thread_id)) 
    print(timestamp(t0)+"Free core "+str(thread_id)) 

thread_list = [] 
for thread_id in range(2): 
    p = Process(target=fonction, args=((thread_id),"test")) 
    p.start() 
    thread_list.append(p) 

...输出在我的Linux机器上:

[0.00588583946228] Load core 0 
[0.00625395774841] test on core 0 
[0.00644302368164] Free core 0 
[0.007572889328] Load core 1 
[0.00768899917603] test on core 1 
[0.00770998001099] Free core 1 

所以这会好的。你能否发送更完整的代码片段?

+0

在我的Linux上,我正在研究win32过程。我会尝试David Hefferman的解决方案。谢谢 –