中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Python線程和鎖是什么

本篇內(nèi)容主要講解“Python線程和鎖是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python線程和鎖是什么”吧!

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、磁縣網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、磁縣網(wǎng)絡(luò)營(yíng)銷、磁縣企業(yè)策劃、磁縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供磁縣建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.2m8n56k.cn

概述

線程和鎖是硬件底層的軟件定義形式化,因此包含最簡(jiǎn)單的可能并發(fā)模型。它構(gòu)成了其他構(gòu)建在其頂層的并發(fā)抽象基礎(chǔ),因此理解這一點(diǎn)很重要。然而,直接在這些基礎(chǔ)上構(gòu)建可靠,可擴(kuò)展的系統(tǒng)是很困難的或著說(shuō)是不可能的。

雖然大多數(shù)語(yǔ)言都支持線程和鎖,但CPython仍然使用全局解釋器鎖來(lái)防止線程同時(shí)訪問(wèn)共享內(nèi)存,因?yàn)镃Python的內(nèi)存管理是非線程安全的。雖然阻塞操作發(fā)生在GIL之外并且可能提高性能,但是線程切換所需的系統(tǒng)調(diào)用開(kāi)銷可能會(huì)降低性能。這意味著Python中的線程主要用于I/O受限的場(chǎng)景,而不是CPU受限的場(chǎng)景。

說(shuō)句題外話,我提到了CPython,因?yàn)镻ython規(guī)范的其他部分實(shí)現(xiàn),例如Jython,沒(méi)有全局解釋器鎖。然而,這些實(shí)現(xiàn)在實(shí)踐中并沒(méi)有被廣泛使用,因?yàn)?**:沒(méi)有人想要支持多Python實(shí)現(xiàn),除非他們不得不這樣;第二:它們還不夠豐富;第三:由于需要原生支持C/C++擴(kuò)展API,Python語(yǔ)言定義與C/C++緊密耦合,與其說(shuō)是技術(shù)規(guī)范不如說(shuō)是一個(gè)參考實(shí)現(xiàn)。

Python通過(guò)高級(jí)模塊threading模塊和低級(jí)模塊_thread直接支持線程。想要獲得更多有關(guān)這些模塊如何工作的信息,可以在線獲取源代碼。

入門

Python中典型的單線程“Hello World”執(zhí)行非常簡(jiǎn)單:

Python線程和鎖是什么

多線程模擬并沒(méi)有太大的不同:

Python線程和鎖是什么

基于我有限數(shù)量的測(cè)試,上面的腳本運(yùn)行結(jié)果如下所示:

Python線程和鎖是什么

我用了get_ident()打印“線程標(biāo)識(shí)符”(一個(gè)魔法值,除了在運(yùn)行時(shí)消除不同線程之間的歧義之外,沒(méi)有任何意義)。你可以看到在某些情況下,線程標(biāo)識(shí)符是如何不同的,而在其他一些情況下,線程標(biāo)識(shí)符又是相同的。相同的線程標(biāo)識(shí)符并不意味著仍工作在同一個(gè)線程上,但如果工作不重疊并且不需要不同的線程標(biāo)識(shí)符,Python會(huì)重新使用該標(biāo)識(shí)符。

陷阱:時(shí)序性和一致性

如果你用threading.current_thread().getName()將線程標(biāo)識(shí)符與線程名交換,你可能會(huì)獲得有序結(jié)果,很大的原因可能是因?yàn)槊總€(gè)線程使用相同的函數(shù)和源碼路徑,因此,每個(gè)線程之間的延遲差異是微不足道的,僅次于解釋器的延遲。然而,這并不意味著有序執(zhí)行能夠得到保證;這是WikiBooks上“Python  Programming”的一個(gè)例子,其中每個(gè)線程的創(chuàng)建和每個(gè)線程的執(zhí)行具有明顯不同的時(shí)序性:

Python線程和鎖是什么

以下結(jié)果是同一個(gè)樣本運(yùn)行的輸出:

Python線程和鎖是什么

這日志表示線程創(chuàng)建/執(zhí)行是交錯(cuò)的。由于增加功能的可變性增加,隨著線程創(chuàng)建和執(zhí)行之間的時(shí)序越來(lái)越不一致,這些結(jié)果將變得越來(lái)越不可預(yù)測(cè)。但原理仍然是相同的;使用多個(gè)線程時(shí)無(wú)法保證一致的行為。

陷阱:訪問(wèn)共享內(nèi)存

當(dāng)不同的線程訪問(wèn)共享內(nèi)存時(shí),這可能導(dǎo)致不正確的行為。你可以擴(kuò)展此示例以在使用多個(gè)線程進(jìn)行計(jì)數(shù)時(shí)查看競(jìng)爭(zhēng)條件:

Python線程和鎖是什么

這會(huì)在一次示例運(yùn)行時(shí)生成如下輸出:

Python線程和鎖是什么

此結(jié)果因創(chuàng)建的線程數(shù)而異,但你可以看到結(jié)果28與預(yù)期值100有多大區(qū)別。Counter().count是非線程安全的,在這里進(jìn)行了演示(如果你有與我不同的機(jī)器,你可能會(huì)得到與28不同的結(jié)果)。如果遇到競(jìng)爭(zhēng)條件,沒(méi)有足夠的日志記錄,可能很難找到相關(guān)的代碼部分。

陷阱:死鎖

當(dāng)兩個(gè)代理嘗試獲取共享內(nèi)存的相同區(qū)域時(shí),最終就會(huì)發(fā)生死鎖。當(dāng)在處理線程和鎖的低級(jí)抽象時(shí),唯一的解決方案是確保每個(gè)代理有一種方法能正確地管理其鎖,或者具有鎖協(xié)調(diào)的整體規(guī)范。例如,用餐哲學(xué)問(wèn)題強(qiáng)調(diào)了流程同步的重要性。Rosetta  Code的用餐哲學(xué)python解決方案解決了這個(gè)同步問(wèn)題:如果你(代理)不能及時(shí)獲取這兩個(gè)分叉,你可以釋放你已經(jīng)擁有的任何叉子,以便另一個(gè)代理可以同時(shí)獲得這兩個(gè)叉子。

Python線程和鎖是什么

此方法不排除其他鎖定方法,像鎖定順序,或涉及流程同步的系統(tǒng)設(shè)計(jì),像使用信號(hào)量的生產(chǎn)者-消費(fèi)者模型,但在Python中可能不如在其他語(yǔ)言中普遍。

陷阱:異形方法和依賴關(guān)系

如果要在Python應(yīng)用程序中應(yīng)用多線程,那么你希望保證整個(gè)堆棧的正確性,你必須手動(dòng)驗(yàn)證核實(shí)線程安全性和依賴項(xiàng)的線程模型。有些為企業(yè)級(jí)多服務(wù)環(huán)境使用而設(shè)計(jì)的依賴項(xiàng),例如redis,可以在設(shè)計(jì)階段首先考慮它們的并發(fā)模型(請(qǐng)參閱黑客新聞antirez關(guān)于多線程版本redis的評(píng)論)。有些依賴可能不會(huì);使用boto2時(shí),并行使用multiprocessing.pool.Pool從S3并行下載文件時(shí),我可能遇到了死鎖,這需要重寫一個(gè)函數(shù)。因此,另一個(gè)依賴性的困難出現(xiàn)了;它們無(wú)法被同化,這意味著如果你在你的應(yīng)用使用依賴模型之前沒(méi)有驗(yàn)證所有將使用的依賴關(guān)系,那么在嘗試為特定用途添加依賴項(xiàng)時(shí),你可能陷入項(xiàng)目的死胡同。

多線程日志記錄

如果你選擇使用Python中的原生線程模型,你可能會(huì)驚喜地發(fā)現(xiàn)logging模塊不僅是線程安全的,而且還支持從任何特定線程或進(jìn)程進(jìn)行日志記錄(示例在logging手冊(cè))。然后,難點(diǎn)是在你的應(yīng)用程序中哪里更可能觸發(fā)異常,這如何影響你的線程模型以及確保在這些代碼段周圍進(jìn)行可靠的日志記錄。將日志添加到你的應(yīng)用可能會(huì)產(chǎn)生不小的延遲,正如pylint通過(guò)警告模塊logging-lazy-interpolation通知你那樣,這也可能會(huì)給你的線程模型帶來(lái)困難。

concurrent.futures

在撰寫這篇文章時(shí)發(fā)現(xiàn)Python

multiprocessing.pool.ThreadPool實(shí)現(xiàn)從未被記錄或測(cè)試過(guò),因?yàn)樗鼜奈赐瓿桑@讓我感覺(jué)非常不愉快。它在Python3.7中仍然還是這樣,因?yàn)樗霈F(xiàn)在GitHub鏡像的源代碼中。鑒于全局解釋器鎖的無(wú)所不在,以及未來(lái)并發(fā)程序主要是并行I/O相關(guān)的工作,使用Python3.x中提供的像concurrent.futures.Executor或類似的新異步模式可能更有意義,因?yàn)樗麄兏妗N覜](méi)有使用過(guò)這個(gè)模塊,但我想與multiprocessing相比,它不會(huì)產(chǎn)生顯著的性能損耗。

到此,相信大家對(duì)“Python線程和鎖是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章題目:Python線程和鎖是什么
網(wǎng)頁(yè)路徑:http://www.2m8n56k.cn/article10/joosdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司微信小程序網(wǎng)站導(dǎo)航微信公眾號(hào)ChatGPT關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
主站蜘蛛池模板: 中文字幕精品视频 | 找国产毛片 | 男女乱淫真视频免费一级毛片 | 免费观看日本高清a毛片 | 欧美性高清bbbbbbxxxxx | 中文字幕在线一区二区三区 | 精品久久久久久综合网 | 欧美在线不卡 | 成年18网站免费视频网站 | 亚洲综合色一区二区三区另类 | 国产一区二区在线观看免费 | 玖草在线资源 | 国产a级三级三级三级 | 欧美一区二区精品系列在线观看 | 久久se精品一区精品二区 | 欧美成人欧美激情欧美风情 | 99精品观看 | 国内自产拍自a免费毛片 | avtt亚洲一区中文字幕 | 亚洲夜色 | 一级片 720p| 欧美亚洲日本一区二区三区浪人 | 男人的天堂亚洲 | 亚洲天堂精品在线观看 | 在线精品国产成人综合第一页 | 国产孕妇孕交视频在线观看 | 美女被拍拍拍拍拍拍拍拍 | 欧美在线一区二区三区精品 | 黄网国产| 亚洲一级成人 | 久久国产视频一区 | 亚洲成a人伦理 | 久久精品视频免费观看 | 亚洲成aⅴ人在线观看 | 欧美一级特黄特黄毛片 | 高清精品女厕在线观看 | 国产亚洲一区二区手机在线观看 | 免费一级特黄a | 亚洲第一免费网站 | 白嫩美女一级毛片免费看 | 日韩精品一区二区三区视频 |