国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python 3.11 版本是對(duì)線程安全做了什么更改嗎

這篇具有很好參考價(jià)值的文章主要介紹了Python 3.11 版本是對(duì)線程安全做了什么更改嗎。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

  • 問題:這份代碼在 3.11.3 中它居然輸出 0 ,一度以為自己寫錯(cuò)了,抱著不信邪的態(tài)度,又搞了個(gè) Python 3.9.7 的環(huán)境試了下,果然還是符合自己預(yù)期,輸出不為 0,想問下 3.11 版本中是做了什么修改嗎?
import threading

num = 0


def add():
    global num
    for i in range(10_000_000):
        num += 1


def sub():
    global num
    for i in range(10_000_000):
        num -= 1


if __name__ == "__main__":

    add_t = threading.Thread(target=add)
    sub_t = threading.Thread(target=sub)

    add_t.start()
    sub_t.start()

    add_t.join()
    sub_t.join()

    print("num result : %s" % num)

  • 答案:
    1. 首先在 Python 字節(jié)碼執(zhí)行的時(shí)候 ,GIL 并不是隨時(shí)能在任意位置中斷切換線程。只有在主動(dòng)檢測中斷的地方才可能發(fā)生線程切換。這個(gè)是大前提

    2. 3.10 之前的版本中,INPLACE_ADD 這個(gè) opcode 之后 GIL 會(huì)去主動(dòng)監(jiān)測中斷,所以導(dǎo)致現(xiàn)成不安全。3.10 的代碼中有一個(gè)提交,https://github.com/python/cpython/commit/4958f5d69dd2bf86866c43491caf72f774ddec97
      根據(jù) T. Wouters 的 Twitter 描述 https://twitter.com/Yhg1s/status/1460935209059328000
      這次提交修改了 INPLACE_ADD 之后主動(dòng)監(jiān)測中斷的操作。使得 INPLACE_ADD 之后無論如何都不會(huì)發(fā)生線程切換,因此雖然是兩個(gè) opcode ,但是確實(shí)是線程安全。

    3. 因?yàn)樽止?jié)碼中+=的操作是兩步 opcode 操作,且 INPLACE_ADD 之后 GIL 會(huì)主動(dòng)監(jiān)測中斷,導(dǎo)致雖然加了,但是沒有重新賦值,就切換到了別的線程上**。比如 A 線程 當(dāng)前 num=100 。+=1 之后 101 但是買沒來得及重新賦值給 num ,GIL 切換了線程,再 B 線程中 num 還是 100 ,-=之后就是 99 ,但是這個(gè)線程卻賦值給了 num ,此時(shí) num 就是 99 然后又且回了 A 線程**。結(jié)果線程將中斷時(shí)候的 101 賦值給了 num 導(dǎo)致此時(shí) num 變成了 101 就出現(xiàn)問題了

    4. 3.10 以后就不會(huì)出現(xiàn)這個(gè)問題了,因?yàn)?INPLACE_ADD 操作之后 GIL 不再會(huì)主動(dòng)檢測中斷,意味著正常情況下執(zhí)行完+=之后線程不會(huì)被切換,而是正確執(zhí)行了賦值給 num 的操作文章來源地址http://www.zghlxwxcb.cn/news/detail-698772.html

到了這里,關(guān)于Python 3.11 版本是對(duì)線程安全做了什么更改嗎的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python3.8,3.9,3.10,3.11特性比較

    最近計(jì)劃將python2遷移到python3,由于本人學(xué)習(xí)時(shí)用的3.7版本,所以僅作大于3.7版本的比較。 文檔地址:python3.8 作用:避免重復(fù)調(diào)用,使代碼更加簡潔。PS:別當(dāng)GO寫,它不支持聲明并賦值變量 作用: 新增了一個(gè)函數(shù)形參語法 / 用來指明某些函數(shù)形參必須使用僅限位置而非關(guān)鍵

    2024年02月05日
    瀏覽(52)
  • 安裝python 3.11以及安裝pip過程-是安裝embedded純凈版的python

    為了純凈,我在Win10上選擇安裝了embedded的版本的python 3.11,結(jié)果為了安裝pip倒騰了一早上?,F(xiàn)記錄如下。 一、安 裝python 3.11 從python官網(wǎng)下的,今天的版本是3.11.1,鏈接:https://www.python.org/ftp/python/3.11.1/python-3.11.1-embed-amd64.zip,下好之后,解壓到一個(gè)文件夾就行,我的本地文件

    2024年02月17日
    瀏覽(22)
  • Python及Pycharm專業(yè)版下載安裝教程(Python 3.11版)附JetBrains學(xué)生認(rèn)證教程

    Python及Pycharm專業(yè)版下載安裝教程(Python 3.11版)附JetBrains學(xué)生認(rèn)證教程

    本篇主要介紹Python和PyCharm專業(yè)版的下載及安裝方式,以及通過兩種方式進(jìn)行JetBrains學(xué)生認(rèn)證。 1.1、進(jìn)入python官網(wǎng):https://www.python.org 點(diǎn)擊【Downloads】然后選擇需要下載的平臺(tái),這里以【W(wǎng)indows】為例。 1.2、在該頁面選擇要下載的版本。這里選擇的是64位穩(wěn)定發(fā)布3.11.8版本。具

    2024年04月11日
    瀏覽(27)
  • 網(wǎng)絡(luò)基礎(chǔ)3.11

    A (7層)應(yīng)用層:??????? 輸入搞基語言指令(打開微信輸入聊天的話語 人和程序之間的一個(gè)交流平) (6層)表示層:??????? 將人類是使用的 高級(jí)語言翻譯成二進(jìn)制語言 (5層)會(huì)話層:??????? 管理多個(gè)會(huì)話,保證消息正確到達(dá) 指定主機(jī) (4層)傳輸層:????

    2024年03月26日
    瀏覽(18)
  • 3.11 C結(jié)構(gòu)體及結(jié)構(gòu)體數(shù)組

    3.11 C結(jié)構(gòu)體及結(jié)構(gòu)體數(shù)組

    結(jié)構(gòu)體的意義 問題:學(xué)籍管理需要每個(gè)學(xué)生的下列數(shù)據(jù):學(xué)號(hào)、姓名、性別、年齡、分?jǐn)?shù),請(qǐng)用C語言程序存儲(chǔ)并處理一組學(xué)生的學(xué)籍。 思考:如果有多個(gè)學(xué)生,該怎么定義 已學(xué)數(shù)據(jù)類型無法解決。 結(jié)構(gòu)體概述 ?正式: 結(jié)構(gòu)體是由一批數(shù)據(jù)組合而成的結(jié)構(gòu)型數(shù)據(jù)。組成結(jié)構(gòu)

    2024年02月02日
    瀏覽(17)
  • 線程池-手寫線程池C++11版本(生產(chǎn)者-消費(fèi)者模型)

    線程池-手寫線程池C++11版本(生產(chǎn)者-消費(fèi)者模型)

    本項(xiàng)目是基于C++11的線程池。使用了許多C++的新特性,包含不限于模板函數(shù)泛型編程、std::future、std::packaged_task、std::bind、std::forward完美轉(zhuǎn)發(fā)、std::make_shared智能指針、decltype類型推斷、std::unique_lock鎖等C++11新特性功能。 本項(xiàng)目有一定的上手難度。推薦參考系列文章 C++11實(shí)用技

    2024年02月13日
    瀏覽(26)
  • Maven項(xiàng)目中的依賴出現(xiàn)版本沖突,最終發(fā)現(xiàn)是對(duì)Dependency Scope理解有誤

    Maven項(xiàng)目中的依賴出現(xiàn)版本沖突,最終發(fā)現(xiàn)是對(duì)Dependency Scope理解有誤

    再來個(gè)文章目錄 本文記錄一下遇到maven依賴版本沖突后的排查過程說明以及問題原因說明 下面還有投票,幫忙投個(gè)票?? 最近加入了 Apache Dubbo 開源社區(qū),成為了一名Dubbo Contributor。在熟悉Dubbo中的各個(gè)RPC協(xié)議時(shí)根據(jù)官網(wǎng)提供的示例搭建了一個(gè)示例。在熟悉過后想看下谷歌提供

    2023年04月09日
    瀏覽(26)
  • 后端開發(fā)必知的11個(gè)線程安全小技巧

    后端開發(fā)必知的11個(gè)線程安全小技巧

    ? 對(duì)于從事后端開發(fā)的同學(xué)來說,線程安全問題是我們每天都需要考慮的問題。 ? 線程安全問題通俗地講主要是在多線程的環(huán)境下,不同線程同時(shí)讀和寫公共資源(臨界資源)導(dǎo)致的數(shù)據(jù)異常問題。 ? 比如:變量a=0,線程1給該變量+1,線程2也給該變量+1。此時(shí),線程3獲取

    2024年02月15日
    瀏覽(21)
  • ArrayList為什么不是線程安全的,如何保證線程安全?

    ArrayList為什么不是線程安全的,如何保證線程安全?

    官方曰, 線程安全就是多線程訪問時(shí),采?了加鎖機(jī)制,當(dāng)?個(gè)線程訪問該類的某個(gè)數(shù)據(jù)時(shí),進(jìn)?保護(hù),其他線程不能進(jìn)?訪問直到該線程讀取完,其他線程才可使?。不會(huì)出現(xiàn)數(shù)據(jù)不?致或者數(shù)據(jù)污染。線程不安全就是不提供數(shù)據(jù)訪問保護(hù),有可能出現(xiàn)多個(gè)線程先后更改數(shù)

    2024年02月07日
    瀏覽(45)
  • 面試題:HashMap線程不安全 ConcurrentHashMap為什么線程安全

    面試的時(shí)候先會(huì)喊你說說集合,那些集合線程不安全?當(dāng)你說了 HashMap 線程不安全,面試官可能會(huì)進(jìn)一步詢問你是否了解 ConcurrentHashMap ,以及它是如何實(shí)現(xiàn)線程安全的。 ArrayList、LinkedList、TreeSet、HashSet、 HashMap 、TreeMap等都是線程不安全的。 HashTable 是線程安全的。 來看個(gè)例

    2024年04月23日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包