在多线程中共享一个全局变量在python中不起作用

时间:2015-06-28 07:50:59

标签: python multithreading global-variables

我正在尝试在python中的两个函数之间共享一个全局变量。他们在多线程的同时工作。 问题是它像全局变量一样根本不是全局变量,这是我的代码:

import threading as T
import time

nn = False
def f1(inp):
    global nn
    while True:
        inp=inp+1
        time.sleep(0.5)
        print 'a-'+str(inp)+"\n"
        if inp > 10:
            nn=True
            print nn

def f2(inp):
    inp=int(inp)
    while nn:
        inp=inp+1
        time.sleep(1)
        print 'b-'+str(inp)+"\n"

t1= T.Thread(target=f1, args = (1,))
t1.daemon = True
t1.start()
t2= T.Thread(target=f2, args = (1,))
t2.daemon = True
t2.start()

2 个答案:

答案 0 :(得分:1)

问题是while nn只被评估一次。如果是,则恰好为False,因为f1尚未使True成为f2,因此nn = True完成了运行。如果您初始化f1,则f2和{{1}}

都会看到它正在被访问

答案 1 :(得分:1)

全局变量在python中运行良好。

您的代码中的问题是您首先启动f1函数,该函数进入休眠状态0.5秒。

然后在启动f1后立即启动f2,然后在内部启动循环 - while nn - 但f2的初始值为False,因此它永远不会进入while循环,并且该线程结束。

您是否真的希望代码从开始f1线程和while nn条件(以便nn可以设置为True)到达时间超过0.5秒?我认为该计划到达那里不会超过几纳秒。

全局变量工作示例 -

>>> import threading
>>> import time
>>> def func():
...     global l
...     i = 0
...     while i < 15:
...             l.append(i)
...             i += 1
...             time.sleep(1)
>>> def foo(t):
...     t.start()
...     i = 20
...     while i > 0:
...             print(l)
...             i -= 1
...             time.sleep(0.5)
>>> l = []
>>> t = threading.Thread(target=func)
>>> foo(t)
[0]
[0]
[0]
[0, 1]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]