1. 程式人生 > 程式設計 >python 多執行緒共享全域性變數的優劣

python 多執行緒共享全域性變數的優劣

一、多執行緒共享全域性變數

首先我們來回憶下在函式中修改全域性變數的情況。

在一個函式中,對全域性變數進行修改的時候,到底是否需要使用 global 進行說明,要看是否對全域性變數的執行指向進行了修改。

如果修改了執行指向,即讓全域性變數指向了一個新的地方,那麼必須使用 global。

如果僅僅是修改了指向的空間中的資料,此時不是必須要使用 global。

我們來看一個例子,在這個例子中,讓一個子執行緒對全域性變數 +1 操作,另一個子執行緒只打印全域性變數,看看資料是否共享。

from threading import Thread
import time

g_num = 100

def work1():
  global g_num
  g_num += 1
  print("----in work1,g_num is %d---" % g_num)

def work2():
  print("----in work2,g_num is %d---" % g_num)

def main():
  print("---執行緒建立之前g_num is %d---" % g_num)

  t1 = Thread(target=work1)
  t1.start()

  # 延時一會,保證t1執行緒中的事情做完
  time.sleep(1)

  t2 = Thread(target=work2)
  t2.start()

  time.sleep(1)
  print("---執行緒建立之後g_num is %d---" % g_num)

if __name__ == "__main__":
  main()

如果子執行緒2打印出來的結果是100,說明全域性變數不共享。

如果子執行緒2打印出來的資料是101,說明全域性變數共享。

執行結果:

---執行緒建立之前g_num is 100---
----in work1,g_num is 101---
----in work2,g_num is 101---
---執行緒建立之後g_num is 101---

上面的例子說明,多執行緒是共享全域性變數的。

二、列表當做實參傳遞到執行緒中

在上面,我們驗證了多執行緒之間是共享全域性變數的。

我們也可以將變數當作實參傳遞到執行緒中,來驗證多執行緒中是共享資料的。

from threading import Thread
import time

def work1(nums):
  nums.append(44)
  print("----in work1---",nums)

def work2(nums):

  print("----in work2---",nums)


g_nums = [11,22,33]

t1 = Thread(target=work1,args=(g_nums,))
t1.start()
# 延時一會,保證t1執行緒中的事情做完
time.sleep(1)
t2 = Thread(target=work2,))
t2.start()

執行結果:

----in work1--- [11,33,44]
----in work2--- [11,44]

那為什麼多個執行緒之間要共享全域性變數,有什麼好處麼?

因為多工往往配合使用。

在一個程序內的所有執行緒共享全域性變數,就可以很方便在多個執行緒間共享資料。

缺點就是,執行緒是對全域性變數隨意修改可能造成多執行緒之間對全域性變數的混亂(即執行緒非安全)。

以上就是python 多執行緒共享全域性變數的優劣的詳細內容,更多關於python 多執行緒共享全域性變數的資料請關注我們其它相關文章!