1. 程式人生 > >Python多執行緒下的全域性變數、區域性變數

Python多執行緒下的全域性變數、區域性變數

最近開發一個新功能遇到一個問題,就是在一個A.py檔案生成2個執行緒,呼叫B.py裡的函式,B.py裡面有若干global定義全域性變數,導致程式得不到想要的結果。B.py檔案裡面的全域性變數,被A.py裡面的2個執行緒所共享,一個執行緒改變了他們的值,另外一個執行緒讀取到的值就是改變之後的值。

A.py程式碼如下:

if __name__=='__main__':
    for i in range(2): 
        t = threading.Thread(target=getGloble.init,args=((i,i)))
        t.start()
        time.sleep(5)</span>
B.py程式碼如下:
num=1 

def init(i,m):
    global num
    print(str(i)+str(num))
    num=num+1
    print(str(i)+str(num))
    num=num+1
    print(str(i)+str(num))</span>
得到的結果為:
01
02
03
13
14
15</span>
第二個執行緒讀取到num的值為第一個執行緒對num值改變之後的值,這個num為兩個執行緒所共享。那麼,如何才能得到每個執行緒自己的全域性變數而不被其他執行緒所共享呢?請看如下程式碼:

A.py程式碼如下:

if __name__=='__main__':
    for i in range(2): 
        t = threading.Thread(target=getGloble.init,args=((i+1,i+1)))
        t.start()
        time.sleep(5)</span>
B.py程式碼如下:
class people:
    age = 0
    def __init__(self,a):
        self.age = a
    def change(self,i):  
        print('age change before is '+str(self.age))
        self.age = self.age + i
        print('age change to '+str(self.age))


def init(i,m):
    p = people(10)
    p.change(i)</span>
得到的結果為:
age change before is 10
age change to 11
age change before is 10
age change to 12</span>
        每個執行緒都對自己的People物件進行管理,互相不干擾。執行緒1改變了People.age的值,執行緒2繼續訪問,但是獲取的值還是原初始值,並未受到執行緒1的影響。這樣能夠很好的保護執行緒自己的資源物件,如果每個執行緒做同樣的事情,而且不希望各個執行緒的資源變數受到影響,那麼該方法是個不錯的選擇。

相關推薦

Python執行全域性變數區域性變數

最近開發一個新功能遇到一個問題,就是在一個A.py檔案生成2個執行緒,呼叫B.py裡的函式,B.py裡面有若干global定義全域性變數,導致程式得不到想要的結果。B.py檔案裡面的全域性變數,被A.py裡面的2個執行緒所共享,一個執行緒改變了他們的值,另外一個執行緒讀取到

Python 執行,(全域性變數)資料共享,threading.Lock() 互斥鎖

  demo.py(互斥鎖): import threading import time # 定義一個全域性變數 g_num = 0 def test1(num): global g_num # 全域性變數可以實現執行緒間資料共享。也可以通過傳參實現 fo

python執行-共享全域性變數

目錄 多執行緒-共享全域性變數 多執行緒-共享全域性變數 列表當作實參傳遞到執行緒中 總結 多執行緒-共享全域性變數問題 多執行緒開發可能遇到的問題 測試1 測試2 多執行緒-共享全域性變數 多執行緒-共享全域性變

Python執行變數問題

def process_student(name):   std = Student(name)   # std是區域性變數,但是每個函式都要用它,因此必須傳進去:   do_task_1(std)   do_task_2(std)   def do_task_1(std):   do_subtask_1(s

python執行————3執行間通訊:共享變數,queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):

Python執行程序和協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

基於執行全域性變數

def current_nation default_nation = (current_contact && current_contact&.company&.country) ? current_contact&.company&.count

PYTHON——執行:條件變數(Condition)

  條件變數(Condition)也是一把鎖,除了同步鎖的作用外,還具有線上程間通訊的功能。   有一類執行緒需要滿足條件之後才能夠繼續執行,Python提供了threading.Condition 物件用於條件變數執行緒的支援,它除了能提供RLock()或Lock()的方法外,還提供了 wait()、no

python執行程序協程的使用

本文主要介紹多執行緒、多程序、協程的最常見使用,每個的詳細說明與介紹有時間會在以後的隨筆中體現。 一、多執行緒 1.python通過兩個標準庫thread和threading提供對執行緒的支援。thread提供了低級別的、原始的執行緒以及一個簡單的鎖。threading通過對thread模組

Python執行變數優化—threadLocal

Python多執行緒變數優化—threadLocal 再多執行緒的環境下,每個執行緒都有自己的資料。在多執行緒程式設計中應該儘量使用區域性變數,避免使用全域性變數(全域性變數需要加鎖處理)。使用全域性變數時還要考慮變數能不能被共享。 但是使用區域性變數需要在每個函式作為引數傳遞,很麻

python執行————8執行程序對比

#多程序程式設計 #耗cpu的操作,用多程序程式設計,對於io操作來說,使用多執行緒程式設計,程序切換代價要高於執行緒 import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor,as_compl

python執行————7ThreadPoolExecutor執行

所用到的模組:from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED 1、建立執行緒池:executor = ThreadPoolExecutor(max_workers= ) 2

python執行————6執行同步之Semaphore

控制程式碼進入執行緒的數量,控制併發數量,可以使用訊號量Semaphore。 1、定義訊號量sem  =  threading.Semaphore(3)  #3為併發數量 2、消耗訊號量 sem.acquire() 3、釋放訊號量 sem.release()

python執行————4執行同步之Lock,RLock

     在多執行緒同時請求同一個資源並進行修改時可能會造成結果出錯,例如共享變數       from dis import dis import threading a = 0 def add(): global a

python執行———2建立執行的兩種方式

 法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

python執行——1GIL

一、GIL是什麼?        執行緒全域性鎖(Global Interpreter lock),python保護執行緒安全而採取的獨立執行緒執行的限制。      1、明確一點GIL並不是python的特性,pytho

python-執行-共享變數問題

import threading sum = 0 loopSum = 1000000 lock = threading.Lock() def Add(): global sum, loopSum for i in range(1,loopSum): loc

Python基礎(四)--- Python執行介紹,開啟執行的三種方式,time模組,join,Daemon,LockRlock,事件機制,Timer

一、多執行緒介紹 --------------------------------------------------------- 1.threading用於提供執行緒相關的操作,執行緒是應用程式中工作的最小單元。 2.python當前版本的多執行緒庫沒有實現優先順序、執行緒組,執

Python 執行程序 (二)之 執行同步通訊

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python多執行緒 對於I/O操作的時候,程序與執行緒的效能差別不大,甚至由於執行緒更輕量級,效能更高

Python 執行程序 (一)之 原始碼執行流程GIL

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python程式的執行原理 許多時候,在執行一個python檔案的時候,會發現在同一目錄下會出現一個__