1. 程式人生 > >Python學習總結筆記(4)--執行緒區域性變數之Threading.local

Python學習總結筆記(4)--執行緒區域性變數之Threading.local

當我們使用執行緒的時候,能使用執行緒的區域性變數,就儘量不要用全域性變數,因為使用全域性變數涉及同步的問題(參見我的上一篇部落格Python學習總結筆記(3)–多執行緒與執行緒同步 )。

使用區域性變數的時候,需要傳遞引數,比如有這樣一個例子,程式需要處理客戶申請,每來一個客戶,就新開一個執行緒進行處理,而客戶有姓名、年齡、性別等屬性(引數),如果都需要傳遞引數的話很繁瑣。Python提供了threading.local模組,方便我們實現執行緒區域性變數的傳遞。直接看下面的例子:

# /usr/bin/env python
# coding:utf-8

__author__ = 'kikay'
import threading # Threading.local物件 ThreadLocalHelper = threading.local() lock = threading.RLock() class MyTheadEx(threading.Thread): def __init__(self, threadName, name, age, sex): super(MyTheadEx, self).__init__(name=threadName) self.__name = name self.__age = age self.__sex = sex def
run(self):
global ThreadLocalHelper ThreadLocalHelper.ThreadName = self.name ThreadLocalHelper.Name = self.__name ThreadLocalHelper.Age = self.__age ThreadLocalHelper.Sex = self.__sex MyTheadEx.ThreadPoc() # 執行緒處理函式 @staticmethod def ThreadPoc
():
lock.acquire() try: print 'Thread={id}'.format(id=ThreadLocalHelper.ThreadName) print 'Name={name}'.format(name=ThreadLocalHelper.Name) print 'Age={age}'.format(age=ThreadLocalHelper.Age) print 'Sex={sex}'.format(sex=ThreadLocalHelper.Sex) print '----------' finally: lock.release() if __name__ == '__main__': Tom = {'Name': 'tom', 'Age': 20, 'Sex': 'man'} xiaohua = {'Name': 'xiaohua', 'Age': 18, 'Sex': 'woman'} Andy = {'Name': 'Andy', 'Age': 40, 'Sex': 'man'} T = (Tom, xiaohua, Andy) threads = [] for i in range(len(T)): t = MyTheadEx(threadName='id_{0}'.format(i), name=T[i]['Name'], age=T[i]['Age'], sex=T[i]['Sex']) threads.append(t) for i in range(len(threads)): threads[i].start() for i in range(len(threads)): threads[i].join() print 'All Done!!!'

執行結果:

Thread=id_0
Name=tom
Age=20
Sex=man
----------
Thread=id_1
Name=xiaohua
Age=18
Sex=woman
----------
Thread=id_2
Name=Andy
Age=40
Sex=man
----------
All Done!!!

可見,每個執行緒都可以對threading.local物件進行讀寫,且互相不干擾。合理使用threading.local可以極大簡化程式碼邏輯,同時保證各個子執行緒的資料安全。Threading.local最大的用處就是HTTP請求時繫結使用者的資訊,這樣每個使用者執行緒可以非常方便訪問各自的資源而互不干擾。

相關推薦

Python學習總結筆記4--執行區域性變數Threading.local

當我們使用執行緒的時候,能使用執行緒的區域性變數,就儘量不要用全域性變數,因為使用全域性變數涉及同步的問題(參見我的上一篇部落格Python學習總結筆記(3)–多執行緒與執行緒同步 )。 使用區域性變數的時候,需要傳遞引數,比如有這樣一個例子,程式需要處理客戶

Python學習總結筆記10-- MySQL資料庫操作SQLAlchemy使用總結

SQLAlchemy是一個著名的ORM框架,使用ORM操作資料庫,不用去關注SQL語句本身,這樣可以提高開發的效率。同時使用ORM框架雖然可以減少程式碼編寫的消耗,但是可能也會執行很多冗餘的資料庫操作,降低程式的執行效率。不過總的來說,合理利用ORM框架與資料庫

Python學習手冊筆記1Python對象類型

python 在Python中一切皆對象,Python程序可以分解為模塊、語句、表達式及對象。如下所示:1 程序由模塊組成2 模塊包含語句3 語句包含表達式4 表達式建立並處理對象 內置對象(核心類型):1)數字:>>> 2+2 #整數加法4>>&g

《自己動手寫java虛擬機器》學習筆記-----執行私有執行時資料區go

     專案地址:https://github.com/gongxianshengjiadexiaohuihui      在執行java程式時,Java虛擬機器需要使用記憶體來存放各種各樣的資料,Java虛擬機器規範把這些記憶體的區

CUDA學習筆記2- 執行並行和塊並行

1. 獲取顯示卡裝置資訊 有些顯示卡支援CUDA有些不支援,那麼如何確定主機的顯示卡裝置是否支援CUDA呢。可以使用下面的函式獲取顯示卡的相關資訊。 cudaError_t cudaGetDeviceCount(int *count) 獲取支援CUD

C#學習筆記11- 執行類與程序類

為什麼要使用多執行緒? 讓計算機“同時”做多件事情,節約時間 多執行緒可以讓一個程式“同時”處理多個事情 後臺執行程式,提高程式的執行效率,也不會使主介面出現無響應的情況 獲得當前執行緒與當前程序 前臺執行緒與後臺執行緒 前臺執行緒:只有所

java 併發程式設計學習筆記執行

                                          &nb

JUC學習筆記2執行間通訊

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; cla

Python學習 讀書筆記1

1. 轉義字元必須 ,’\n’,來和變數分開 2. 當Python直譯器讀取原始碼時,為了讓它按UTF-8編碼讀取,檔案開頭寫上這兩行: #!/usr/bin/env python3 # -*- coding: utf-8 -*- 第一行註釋是

Python刷題筆記4- 字串重組

題目: Complete the method/function so that it converts dash/underscore delimited words into camel casing. The first word within the output

Bootstrap學習總結筆記23-- 基本外掛輪播幻燈片

Bootstrap 輪播(Carousel)外掛是一種靈活的響應式的向站點新增滑塊的方式。 0x01 基本例項 Bootstrap實現輪播幻燈片的效果,只需要簡單地使用class開發就可以了: <!DOCTYPE html> <html

機器學習理論筆記4

高緯度的區域性方法 高維的資料相比於低緯度的來說,多了很多麻煩 。s首先,高維取樣中,同樣比例的鄰域往往需要邊長較長的取樣。為了方便分析,我們假設是在p維單位超立方體中取樣。如圖,取一個佔整個單位體積比例為rr的樣本,那麼取樣邊長就是 ep(r)=r1pe

學習android 筆記4:如何獲取螢幕的相關屬性以及dp 、dip、dpi 、px的概念

<span style="font-size:24px;">DisplayMetrics dm = new DisplayMetrics(); getWindowManager().g

安卓學習筆記——執行的用法及怎樣在子執行中更新UI

建立執行緒方法: 1、新建一個繼承自Thread的類MyThread,然後重寫父類的run()方法,在裡面寫要執行的內容; class MyThread extends Thread { @Ove

Python學習基礎筆記

linux 數據庫 paramiko https 循環 Python一 pyhton .com 字符串 換博客了,還是csdn好一些。 Python學習基礎筆記 1.Python學習—linux下Python3的安裝 2.Python學習—數據類型、運算符、條件語句 3.

機器學習讀書筆記決策樹基礎篇從相親說起

方法 事務 家裏 分類 筆記 判斷 都是 rom tro 一、決策樹 決策樹是什麽?決策樹(decision tree)是一種基本的分類與回歸方法。舉個通俗易懂的例子,如下圖所示的流程圖就是一個決策樹,長方形代表判斷模塊(decision block),橢圓形成代

程式設計師面試寶典隨筆記---執行和程序1,-基礎資訊

①程式,程序,執行緒的區別 程式:程式是由一系列的指令和邏輯組成的一個靜態檔案(如cpp檔案),無論能不能執行,它都客觀的存在於儲存器中。 程序:程序是計算機中的程式關於某資料集合

執行4-執行

目錄 1.1JDK對執行緒池的支援 為了更好的能夠控制多執行緒,JDK提供了一套Executor框架,其本質是一個執行緒池。                                                              

java基礎多執行4執行可見性volatile 執行封閉threadlocal CAS操作

一。執行緒的可見性volatile(不是太常用,因為他只能解決執行緒可見和阻止指令排序,並不能解決多執行緒的併發問題) volatile:(1)保證變數的修改讓所有執行緒可見 (2)阻止指令排序 這個程式有3個結果,0,42,沒有進入迴圈直接結束

執行4-執行

Java5之後提供了執行緒池ThreadPool, concurrent包下的Executors提供了很多建立執行緒池的方法,根據不同需要,分開使用。包括但不限於 newFixedThreadPool