簡體   English   中英

在多線程中共享全局變量在python中不起作用

[英]share a global variable in multi threading doesn't work in python

我正在嘗試在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()

問題是, while nn僅被評估一次。 如果是,則恰好為False因為f1尚未將其設置為True因此f2完成運行。 如果您初始化nn = True ,將會看到f1f2都在訪問它

全局變量在python中工作正常。

代碼中的問題是您首先啟動f1函數,該函數進入睡眠狀態達0.5秒。

然后在啟動f1之后立即啟動f2 ,然后在其中啟動循環while nn但f2的初始值為False,因此它永遠不會進入while循環,並且該線程結束。

您是否真的希望代碼從啟動f1線程和while nn條件開始需要花費超過0.5秒的while nn (以便nn可以設置為True )? 我認為程序到達那里不會花費超過幾納秒的時間。

全局變量工作示例-

>>> 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM