最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Python多線程下的變量問(wèn)題

 更新時(shí)間:2015年04月28日 15:49:31   作者:廖雪峰  
這篇文章主要介紹了Python多線程下的變量問(wèn)題,由于GIL的存在,Python的多線程編程問(wèn)題一直是開(kāi)發(fā)者中的熱點(diǎn)話題,需要的朋友可以參考下

在多線程環(huán)境下,每個(gè)線程都有自己的數(shù)據(jù)。一個(gè)線程使用自己的局部變量比使用全局變量好,因?yàn)榫植孔兞恐挥芯€程自己能看見(jiàn),不會(huì)影響其他線程,而全局變量的修改必須加鎖。

但是局部變量也有問(wèn)題,就是在函數(shù)調(diào)用的時(shí)候,傳遞起來(lái)很麻煩:

def process_student(name):
  std = Student(name)
  # std是局部變量,但是每個(gè)函數(shù)都要用它,因此必須傳進(jìn)去:
  do_task_1(std)
  do_task_2(std)

def do_task_1(std):
  do_subtask_1(std)
  do_subtask_2(std)

def do_task_2(std):
  do_subtask_2(std)
  do_subtask_2(std)

每個(gè)函數(shù)一層一層調(diào)用都這么傳參數(shù)那還得了?用全局變量?也不行,因?yàn)槊總€(gè)線程處理不同的Student對(duì)象,不能共享。

如果用一個(gè)全局dict存放所有的Student對(duì)象,然后以thread自身作為key獲得線程對(duì)應(yīng)的Student對(duì)象如何?

global_dict = {}

def std_thread(name):
  std = Student(name)
  # 把std放到全局變量global_dict中:
  global_dict[threading.current_thread()] = std
  do_task_1()
  do_task_2()

def do_task_1():
  # 不傳入std,而是根據(jù)當(dāng)前線程查找:
  std = global_dict[threading.current_thread()]
  ...

def do_task_2():
  # 任何函數(shù)都可以查找出當(dāng)前線程的std變量:
  std = global_dict[threading.current_thread()]
  ...

這種方式理論上是可行的,它最大的優(yōu)點(diǎn)是消除了std對(duì)象在每層函數(shù)中的傳遞問(wèn)題,但是,每個(gè)函數(shù)獲取std的代碼有點(diǎn)丑。

有沒(méi)有更簡(jiǎn)單的方式?

ThreadLocal應(yīng)運(yùn)而生,不用查找dict,ThreadLocal幫你自動(dòng)做這件事:

import threading

# 創(chuàng)建全局ThreadLocal對(duì)象:
local_school = threading.local()

def process_student():
  print 'Hello, %s (in %s)' % (local_school.student, threading.current_thread().name)

def process_thread(name):
  # 綁定ThreadLocal的student:
  local_school.student = name
  process_student()

t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('Bob',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()

執(zhí)行結(jié)果:

Hello, Alice (in Thread-A)
Hello, Bob (in Thread-B)

全局變量local_school就是一個(gè)ThreadLocal對(duì)象,每個(gè)Thread對(duì)它都可以讀寫(xiě)student屬性,但互不影響。你可以把local_school看成全局變量,但每個(gè)屬性如local_school.student都是線程的局部變量,可以任意讀寫(xiě)而互不干擾,也不用管理鎖的問(wèn)題,ThreadLocal內(nèi)部會(huì)處理。

可以理解為全局變量local_school是一個(gè)dict,不但可以用local_school.student,還可以綁定其他變量,如local_school.teacher等等。

ThreadLocal最常用的地方就是為每個(gè)線程綁定一個(gè)數(shù)據(jù)庫(kù)連接,HTTP請(qǐng)求,用戶身份信息等,這樣一個(gè)線程的所有調(diào)用到的處理函數(shù)都可以非常方便地訪問(wèn)這些資源。

相關(guān)文章

  • Python常見(jiàn)讀寫(xiě)文件操作實(shí)例總結(jié)【文本、json、csv、pdf等】

    Python常見(jiàn)讀寫(xiě)文件操作實(shí)例總結(jié)【文本、json、csv、pdf等】

    這篇文章主要介紹了Python常見(jiàn)讀寫(xiě)文件操作,結(jié)合實(shí)例形式總結(jié)分析了Python常見(jiàn)的各種文件讀寫(xiě)操作,包括文本、json、csv、pdf等文件的讀寫(xiě)與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • opencv將視頻逐幀保存為圖片的實(shí)現(xiàn)示例

    opencv將視頻逐幀保存為圖片的實(shí)現(xiàn)示例

    本文使用python-opencv將本地視頻逐幀保存為圖片(.jpg)格式,將保存的圖片放在當(dāng)前目錄的一個(gè)文件夾內(nèi),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • tkinter如何獲取復(fù)選框(Checkbutton)的值

    tkinter如何獲取復(fù)選框(Checkbutton)的值

    這篇文章主要介紹了tkinter如何獲取復(fù)選框(Checkbutton)的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Flask SocketIO實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解

    Flask SocketIO實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解

    Flask-SocketIO 是基于 Flask 的一個(gè)擴(kuò)展,用于簡(jiǎn)化在 Flask 應(yīng)用中集成 WebSocket 功能,本文主要介紹了Flask SocketIO如何實(shí)現(xiàn)動(dòng)態(tài)繪圖,需要的可以參考下
    2023-11-11
  • 解決NameError:name'pip'is not defined使用pip時(shí)報(bào)錯(cuò)問(wèn)題

    解決NameError:name'pip'is not defined使用pip

    使用pip時(shí)遇到NameError:name ‘pip’ is not defined錯(cuò)誤通常是由于在Python環(huán)境內(nèi)直接嘗試運(yùn)行pip命令導(dǎo)致的,正確的做法是在Python外部的命令行中運(yùn)行pip命令,這個(gè)錯(cuò)誤提醒我們?cè)谑褂胮ip時(shí),應(yīng)確保在正確的環(huán)境中執(zhí)行相關(guān)命令
    2024-10-10
  • python 讀文件,然后轉(zhuǎn)化為矩陣的實(shí)例

    python 讀文件,然后轉(zhuǎn)化為矩陣的實(shí)例

    下面小編就為大家分享一篇python 讀文件,然后轉(zhuǎn)化為矩陣的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 如何將寫(xiě)好的.py/.java程序變成.exe文件詳解

    如何將寫(xiě)好的.py/.java程序變成.exe文件詳解

    有時(shí)候我們需要將自己寫(xiě)的代碼打包成exe文件,給別人使用需要怎么辦呢,下面這篇文章主要給大家介紹了關(guān)于如何將寫(xiě)好的.py/.java程序變成.exe文件的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python使用pyhook監(jiān)控鍵盤(pán)并實(shí)現(xiàn)切換歌曲的功能

    python使用pyhook監(jiān)控鍵盤(pán)并實(shí)現(xiàn)切換歌曲的功能

    這篇文章主要介紹了python使用pyhook監(jiān)控鍵盤(pán)并實(shí)現(xiàn)切換歌曲的功能,非??犰诺囊粋€(gè)小程序,可以讓你在游戲時(shí)避免切出游戲直接換歌,需要的朋友可以參考下
    2014-07-07
  • 詳解如何使用Python實(shí)現(xiàn)過(guò)濾指定進(jìn)程

    詳解如何使用Python實(shí)現(xiàn)過(guò)濾指定進(jìn)程

    Python提供了多種方式來(lái)實(shí)現(xiàn)對(duì)進(jìn)程的過(guò)濾和操作,本文將介紹如何利用Python來(lái)過(guò)濾指定進(jìn)程,并展示一些實(shí)用的技巧和方法,希望對(duì)大家有所幫助
    2024-04-04
  • Tensorflow之Saver的用法詳解

    Tensorflow之Saver的用法詳解

    本篇文章主要介紹了Tensorflow之Saver的用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論

沂南县| 民勤县| 鄂托克旗| 孟津县| 裕民县| 凤城市| 湖北省| 若尔盖县| 鄂尔多斯市| 成武县| 阿克苏市| 侯马市| 葫芦岛市| 邵阳县| 定结县| 隆德县| 玉树县| 宜良县| 正定县| 博客| 隆德县| 凤山市| 普定县| 攀枝花市| 福州市| 洞口县| 和顺县| 岑溪市| 松潘县| 安吉县| 图片| 安庆市| 迭部县| 鹿泉市| 佛教| 东乌珠穆沁旗| 乌鲁木齐县| 特克斯县| 邯郸市| 吉木乃县| 西吉县|