婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python threading Local()函數用法案例詳解

Python threading Local()函數用法案例詳解

熱門標簽:鶴壁手機自動外呼系統違法嗎 高德地圖標注收入咋樣 萊蕪電信外呼系統 B52系統電梯外呼顯示E7 沈陽防封電銷電話卡 怎么辦理400客服電話 企業微信地圖標注 地圖標注多個 銀川電話機器人電話

前言

當多線程訪問同一個公共資源時,如果涉及到修改該公共資源的操作就可能會出現由于數據不同步導致的線程安全問題。一般情況下我們可以通過給公共資源加互斥鎖的方式來處理該問題。

當然,除非必須將多線程使用的資源設置為公共資源的情況。如果一個資源不需要在多個線程之間共享。我們也可以使用Python threading模塊提供的local()方式來避免線程安全問題。
Python threading模塊的local()函數跟Java中的ThreadLocal類有諸多類似的地方,感興趣的小伙伴可以看下Java版的ThreadLoalJava ThreadLocal原理解析以及應用場景分析案例詳解

local() 函數是什么?

threading的local()函數主要是用來封裝公共資源,使得同一個公共資源在不同線程之間得以隔離。這句話該如何理解呢?舉個例子說明下!假設現在有一個大箱子(相當于公共資源),每個人(相當于各個線程)將自己的手機放入這個大箱子里。如果不做任何控制的話,當人們從大箱子中取出手機時極有可能會出現取錯的情況(找不到自己當初放入的手機)。而使用local()函數的話,就相當于對這個大箱子進行管理。當每個人放入手機的時候做一個標記(比如在手機上標記所有者的姓名)并隔離放置到箱子中。這樣當人們從大箱子中取出手機就能準確的找到自己當初放入的手機。

調用local()函數會生成一個ThreadLocal對象,該對象是所有線程都能訪問的,就像上面例子中的大箱子。但是,放入到ThreadLocal對象中的變量則是各個線程所獨有的,隨便變量名相同,但是指向的值則是完全不同的。

local()函數如何用?

local()函數使用的基本語法是:

import threading

local=threading.local()

第一步就是引入threading模塊,第二步就是調用local()函數得到全局的Threadlocal對象。這樣說始終是有點干澀,沒味道。那么就給代碼加點鹽吧。還是從那個大箱子說起。

1. 不做標記,不做隔離

第一個示例代碼就是所有人將自己的手機放入大箱子里,不做標記,不做隔離。先放入,過一段時間后再取出。

import threading
import time


def set_telephone(telephone):
    global global_telephone
    global_telephone = telephone
    print(threading.current_thread().name + " 放入的手機是", global_telephone)
    time.sleep(1)
    get_telephone()


def get_telephone():
    print(threading.current_thread().name + " 取出的手機是", global_telephone)


if __name__ == '__main__':
    for i in range(3):
        thread = threading.Thread(target=set_telephone, name='學生' + str(i), args=('手機' + str(i),))
        thread.start()

運行結果是:

學生0 放入的手機是 手機0

學生1 放入的手機是 手機1

學生2 放入的手機是 手機2

學生0 取出的手機是 手機2

學生1 取出的手機是 手機2

學生2 取出的手機是 手機2

這里有三個線程,分別模擬學生0,學生1,學生2 將各種的手機賦值給一個全局變量global_telephone(大箱子),然后取全局變量global_telephone中的值。可以看出取出的結果都變成了手機2。這顯然沒有達到我們的預期結果。這就是不加控制的后果。

2.使用local()函數加以控制

使用local()函數控制的話,就是將全局變量替換成ThreadLoal對象,由他來管理每個線程中的值。

import threading
import time


def set_telephone(telephone):
    local.telephone = telephone
    print(threading.current_thread().name + " 放入的手機是", local.telephone + "\n")
    time.sleep(1)
    get_telephone()


def get_telephone():
    print(threading.current_thread().name + " 取出的手機是", local.telephone + "\n")


if __name__ == '__main__':
    local = threading.local()
    for i in range(3):
        thread = threading.Thread(target=set_telephone, name='學生' + str(i), args=('手機' + str(i),))
        thread.start()

運行結果是:

學生0 放入的手機是 手機0

學生1 放入的手機是 手機1

學生2 放入的手機是 手機2

學生1 取出的手機是 手機1

學生0 取出的手機是 手機0

學生2 取出的手機是 手機2

可以看出每個學生放入的手機和最終取出的手機是一致的。那么threading的local()函數是如何實現這一效果的呢?我們在這里不妨做一個推理。應該是將手機和它的主人做了一層映射關系。根據主人的唯一標識來尋找自己的手機。

3. 模擬實現local()的功能,創建一個箱子

前面我們推測我們需要定義一個全局的字典來存放每個學生各自放入的手機,字典的鍵是線程ID,值是指定的鍵值對。示例代碼如下:

import threading
import time

global_goods_dict = {}

# {
#     "線程ID":{"telephone":"放入的具體手機"},
#     "線程ID":{"telephone":"放入的具體手機"},
#     "線程ID":{"telephone":"放入的具體手機"}
#
# }

def set_telephone(telephone):
    # 獲取線程ID
    thread_id = threading.get_ident()
    global_goods_dict[thread_id] = {}
    global_goods_dict[thread_id]["telephone"] = telephone
    print(threading.current_thread().name + " 放入的手機是", telephone)
    time.sleep(1)
    get_telephone()


def get_telephone():
    thread_id = threading.get_ident()
    print(threading.current_thread().name + " 取出的手機是", global_goods_dict[thread_id]["telephone"])


if __name__ == '__main__':
    for i in range(3):
        thread = threading.Thread(target=set_telephone, name='學生' + str(i), args=('手機' + str(i),))
        thread.start()

運行結果同上,這里定義了一個全局的字典global_goods_dict,字典的鍵盤是線程ID,這就保證了每個線程只能取到自己設置的數據。字典的值同樣是一個字典。這是因為一個線程的要存的值可能不止一個。這里的global_goods_dict[thread_id]["telephone"] = telephone 就等價于上例中的local.telephone = telephone。這樣使用雖然能達到效果,但是使用起來還是有點繁瑣。那么能不能想local()函數那樣使用起來絲滑呢。

4. 簡化代碼操作,進一步模擬實現local()函數

我們可以將全局的global_goods_dict字典用一個類封裝到一個類中。讓該類在自動的設置值

class MyBox:
    box = {}

    def __setattr__(self, key, value):
        thread_id = threading.get_ident()
        # 單元格已存在
        if thread_id in MyBox.box:
            MyBox.box[thread_id][key] = value
        else:
            MyBox.box[thread_id] = {key: value}

    def __getattr__(self, item):
        thread_id = threading.get_ident()
        return MyBox.box[thread_id][item]


def set_telephone(telephone):
    myBox.telephone = telephone
    print(threading.current_thread().name + " 放入的手機是", myBox.telephone + "\n")
    time.sleep(1)
    get_telephone()


def get_telephone():
    print(threading.current_thread().name + " 取出的手機是", myBox.telephone + "\n")


if __name__ == '__main__':
    myBox = MyBox()
    for i in range(3):
        thread = threading.Thread(target=set_telephone, name='學生' + str(i), args=('手機' + str(i),))
        thread.start()

運行結果同上。這里通過MyBox類封裝了一個名為box的字典。該字典的鍵是當前線程ID,值是賦值的變量名以及值組成的鍵值對。當執行set_telephone方法的myBox.telephone = telephone
,實際上會調用MyBox的__setattr__方法,參數key是telephone,參數value是"手機xx"。當調用myBox.telephone時實際上會調用__getattr__方法,傳入的參數item是telephone。取值時首先獲取當前線程ID。

總結

本文從實際例子出發詳細介紹了threading模塊的local()函數的使用。

到此這篇關于Python threading Local()函數用法案例詳解的文章就介紹到這了,更多相關Python threading Local()函數內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python threading.local代碼實例及原理解析
  • python語言線程標準庫threading.local解讀總結
  • python threading模塊的使用指南
  • Python中threading庫實現線程鎖與釋放鎖
  • python中threading和queue庫實現多線程編程

標簽:葫蘆島 湘西 三亞 呼倫貝爾 銀川 呼倫貝爾 安慶 烏魯木齊

巨人網絡通訊聲明:本文標題《Python threading Local()函數用法案例詳解》,本文關鍵詞  Python,threading,Local,函數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python threading Local()函數用法案例詳解》相關的同類信息!
  • 本頁收集關于Python threading Local()函數用法案例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美午夜在线观看| 久久久久久久久久久久久女国产乱| 3d成人h动漫网站入口| 久久久久久久久久久电影| 亚洲精品乱码久久久久久 | 国产高清不卡一区二区| 91原创在线视频| 久久亚洲精品国产精品紫薇| 亚洲三级在线观看| 国产成人精品综合在线观看| 91麻豆精品国产自产在线 | 日韩一区二区三区在线视频| 国产精品麻豆久久久| 国模娜娜一区二区三区| 欧美日韩另类一区| 亚洲视频小说图片| 国产乱码精品一区二区三| 制服.丝袜.亚洲.另类.中文| 有码一区二区三区| 91蜜桃网址入口| 国产精品久久久久久久浪潮网站 | 国产亚洲一区二区三区在线观看| 天堂精品中文字幕在线| 色94色欧美sute亚洲线路一久 | 经典三级视频一区| 欧美一级专区免费大片| 丝袜脚交一区二区| 欧美视频在线不卡| 午夜精品一区二区三区电影天堂 | 久久精品一区蜜桃臀影院| 日韩国产在线观看一区| 欧美视频一区在线观看| 亚洲电影一区二区三区| 欧美在线免费观看亚洲| 亚洲激情自拍视频| 欧美在线视频不卡| 日韩在线播放一区二区| 欧美一区二区三区在| 视频在线观看一区二区三区| 欧美日韩精品一区视频| 偷拍与自拍一区| 欧美一区二区三区精品| 久久精品国产色蜜蜜麻豆| 欧美本精品男人aⅴ天堂| 加勒比av一区二区| 国产日韩欧美a| www..com久久爱| 亚洲欧美aⅴ...| 欧美亚男人的天堂| 美国欧美日韩国产在线播放| 精品国产第一区二区三区观看体验| 国内精品国产三级国产a久久| 久久精品在线免费观看| 91蜜桃传媒精品久久久一区二区 | 国产精品女主播av| 91黄色免费网站| 日本亚洲三级在线| 久久精品在这里| 欧美在线小视频| 九色porny丨国产精品| 国产精品护士白丝一区av| 欧美亚洲一区二区在线| 另类中文字幕网| 1区2区3区精品视频| 777色狠狠一区二区三区| 国产在线一区二区| 亚洲一区中文日韩| 久久精品视频免费观看| 色婷婷av一区二区三区之一色屋| 日韩中文字幕不卡| 中文字幕亚洲综合久久菠萝蜜| 欧美日韩在线观看一区二区| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品久久久久影院老司 | 久久精品国产澳门| 中文字幕中文字幕中文字幕亚洲无线| 欧美人与性动xxxx| 国产精品18久久久久久久网站| 亚洲精品国产一区二区精华液| 欧美一区二区日韩一区二区| 91在线观看美女| 激情六月婷婷久久| 亚洲国产色一区| 国产精品色哟哟| 日韩一区二区免费在线电影 | 日韩和欧美一区二区| 国产精品色婷婷| 久久精品欧美一区二区三区不卡 | 激情欧美一区二区三区在线观看| 一区二区三区国产豹纹内裤在线| 亚洲国产精品传媒在线观看| 日韩欧美另类在线| 欧洲精品视频在线观看| 99精品视频一区二区| 高清不卡一二三区| 国产综合色产在线精品| 免费成人美女在线观看| 亚洲福利电影网| 成人欧美一区二区三区白人| 久久亚洲免费视频| 欧美巨大另类极品videosbest | 国产精品1区2区3区| 天堂一区二区在线| 一区二区三区欧美日韩| 久久久国产午夜精品| 欧美一区二区大片| 色婷婷av一区二区三区大白胸| 成人爱爱电影网址| 国产一区二区三区蝌蚪| 日韩av一区二区三区四区| 亚洲视频香蕉人妖| 欧美激情一区二区三区在线| 在线亚洲免费视频| 在线观看成人免费视频| 91在线无精精品入口| 国产精品白丝av| 国产一区二区精品久久99| 日韩avvvv在线播放| 中文字幕人成不卡一区| 一区二区视频在线看| 综合激情成人伊人| 日韩理论片中文av| 国产精品国产三级国产普通话蜜臀| 亚洲精品一区二区三区福利| 欧美大胆人体bbbb| 欧美成人精品3d动漫h| 欧美一区二区三级| 日韩视频在线你懂得| 日韩一级完整毛片| 久久精品人人做人人爽97| 日本一区二区三区在线不卡| 国产日韩欧美在线一区| 中文字幕精品一区二区精品绿巨人| ww久久中文字幕| 7777精品伊人久久久大香线蕉超级流畅| 7777精品伊人久久久大香线蕉经典版下载| 欧美日韩免费观看一区三区| 欧美日韩视频第一区| 欧美一区二区三区在线视频| 日韩欧美成人激情| 日韩一卡二卡三卡四卡| 欧美一区二区三区色| 欧美一区二区网站| 欧美一级高清片在线观看| 久久综合久久综合亚洲| 国产欧美中文在线| 亚洲欧美另类久久久精品2019| 日韩在线卡一卡二| 国产福利精品一区| 一本大道久久a久久综合婷婷 | 91久久精品网| 717成人午夜免费福利电影| 日韩一区二区三区视频在线观看| 久久久久久久网| 日韩美女久久久| 亚洲成a人片综合在线| 蜜臀av性久久久久蜜臀av麻豆| 麻豆一区二区三区| 色噜噜狠狠色综合中国| 欧美二区三区的天堂| 久久这里都是精品| 亚洲精品欧美激情| 美女看a上一区| 99久久99久久综合| 欧美一区永久视频免费观看| 中文子幕无线码一区tr | 欧美放荡的少妇| 久久久综合激的五月天| 一区二区成人在线视频| 激情五月播播久久久精品| 色综合天天综合网国产成人综合天| 91久久精品一区二区二区| 国产精品美女久久久久久久| 天天色 色综合| 色综合中文字幕| 精品88久久久久88久久久| 亚洲动漫第一页| 成人精品高清在线| 欧美成人一级视频| 亚洲成av人片在www色猫咪| 国产乱子伦视频一区二区三区 | 日韩精品一区二区三区swag| 亚洲欧洲国产日本综合| 国产精品夜夜嗨| 欧美性高清videossexo| 一级中文字幕一区二区| 国内成人免费视频| 欧美一级理论性理论a| 亚洲韩国精品一区| 欧美系列一区二区| 亚洲乱码国产乱码精品精可以看| 国产一二精品视频| 日韩欧美国产精品一区| 亚洲精品视频免费观看| 色噜噜久久综合| 亚洲免费三区一区二区| 成人精品gif动图一区| 国产欧美一区二区三区沐欲| 国产成人欧美日韩在线电影| 精品国产成人在线影院|