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學習手冊筆記(1):Python對象類型
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)- 執行緒類與程序類
為什麼要使用多執行緒? 讓計算機“同時”做多件事情,節約時間 多執行緒可以讓一個程式“同時”處理多個事情 後臺執行程式,提高程式的執行效率,也不會使主介面出現無響應的情況 獲得當前執行緒與當前程序 前臺執行緒與後臺執行緒 前臺執行緒:只有所
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