日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python 多線程編程的十個關(guān)鍵概念

來源: 責編: 時間:2024-05-21 17:30:30 158觀看
導(dǎo)讀今天我們要一起探索的是Python編程中的一個超炫酷領(lǐng)域——多線程!想象一下,你的程序能像超人一樣同時處理多個任務(wù),是不是很激動人心?讓我們以輕松愉快的方式,一步步揭開它的神秘面紗。1. 線程的初步認知想象你是個廚房大

今天我們要一起探索的是Python編程中的一個超炫酷領(lǐng)域——多線程!想象一下,你的程序能像超人一樣同時處理多個任務(wù),是不是很激動人心?讓我們以輕松愉快的方式,一步步揭開它的神秘面紗。gOt28資訊網(wǎng)——每日最新資訊28at.com

gOt28資訊網(wǎng)——每日最新資訊28at.com

1. 線程的初步認知

想象你是個廚房大廚,一邊炒菜一邊洗菜,這就是多線程的日常。在Python里,threading模塊就是我們的廚房神器。gOt28資訊網(wǎng)——每日最新資訊28at.com

import threadingdef cook():  # 炒菜線程    print("炒菜中...")    def wash():  # 洗菜線程    print("洗菜中...")# 創(chuàng)建線程對象thread1 = threading.Thread(target=cook)thread2 = threading.Thread(target=wash)# 啟動線程thread1.start()thread2.start()# 等待所有線程完成thread1.join()thread2.join()print("飯做好啦!")

這段代碼中,Thread類用來創(chuàng)建線程,target參數(shù)指定線程要執(zhí)行的函數(shù)。start()讓線程開始執(zhí)行,而join()確保主線程等待這些小線程們完成它們的任務(wù)。gOt28資訊網(wǎng)——每日最新資訊28at.com

2. 線程同步:避免廚房混亂

在多線程世界,如果兩個線程同時操作同一資源(比如共享食材),就可能出亂子。這時就需要“鎖”來幫忙了,Python里的鎖叫Lock。gOt28資訊網(wǎng)——每日最新資訊28at.com

import threadingshared_resource = 0lock = threading.Lock()def increase():     global shared_resource    lock.acquire()  # 上鎖,防止同時訪問    shared_resource += 1    lock.release()  # 解鎖,釋放控制權(quán)threads = [threading.Thread(target=increase) for _ in range(100)]for t in threads:    t.start()for t in threads:    t.join()print("共享資源的最終值:", shared_resource)

每次訪問共享資源前,先acquire()上鎖,操作完后release()解鎖,這樣就避免了數(shù)據(jù)混亂。gOt28資訊網(wǎng)——每日最新資訊28at.com

3. 死鎖:可怕的廚房僵局

但鎖用不好也會出問題,就像兩個廚師互相等待對方手中的鍋,形成了死鎖。要小心設(shè)計,避免循環(huán)等待。gOt28資訊網(wǎng)——每日最新資訊28at.com

4. 線程池:高效管理廚房幫手

想象一下,如果你每次炒菜都要新雇一個廚師,那得多浪費?線程池(ThreadPoolExecutor)就是解決這個問題的神器,它預(yù)先創(chuàng)建好一些線程,重復(fù)利用。gOt28資訊網(wǎng)——每日最新資訊28at.com

from concurrent.futures import ThreadPoolExecutordef task(n):    print(f"執(zhí)行任務(wù){(diào)n}")with ThreadPoolExecutor(max_workers=5) as executor:    executor.map(task, range(1, 6))

這里,ThreadPoolExecutor創(chuàng)建了一個最多有5個線程的池,map()函數(shù)并行執(zhí)行任務(wù)列表中的每個任務(wù)。gOt28資訊網(wǎng)——每日最新資訊28at.com

5. 守護線程:廚房的清潔工

守護線程就像廚房的清潔工,在所有其他線程完成后默默清理。通過setDaemon(True)設(shè)置線程為守護線程。gOt28資訊網(wǎng)——每日最新資訊28at.com

def cleaner():    while True:  # 假設(shè)這是一個無限循環(huán),清理任務(wù)        print("打掃廚房...")        if not other_threads_running():  # 假定函數(shù)檢查其他線程是否還在運行            breakclean_thread = threading.Thread(target=cleaner)clean_thread.setDaemon(True)clean_thread.start()# 其他線程的代碼...print("廚房關(guān)閉,清潔完成。")

6. 線程優(yōu)先級:誰先炒誰先洗

雖然Python標準庫沒有直接提供線程優(yōu)先級的功能,但可以通過隊列等間接實現(xiàn)。不過,大多數(shù)情況下,Python的線程調(diào)度是公平的,不需要擔心。gOt28資訊網(wǎng)——每日最新資訊28at.com

7. 全局解釋器鎖(GIL)

Python的GIL是一個讓人又愛又恨的東西,它保證了任何時刻只有一個線程在執(zhí)行Python字節(jié)碼,這對多核CPU來說不是個好消息。但在I/O密集型任務(wù)中,GIL的影響沒那么大。gOt28資訊網(wǎng)——每日最新資訊28at.com

8. 線程局部存儲:我的調(diào)料我做主

不同線程需要不同的“調(diào)料”怎么辦?threading.local()來幫忙,它提供了線程本地的存儲空間。gOt28資訊網(wǎng)——每日最新資訊28at.com

import threadinglocal_data = threading.local()def set_data():    local_data.value = "這是我的調(diào)料"def get_data():    print(local_data.value)t1 = threading.Thread(target=set_data)t2 = threading.Thread(target=get_data)t1.start()t2.start()t1.join()t2.join()

在這里,每個線程都有自己的local_data,互不影響。gOt28資訊網(wǎng)——每日最新資訊28at.com

9. 線程異常處理:防患于未然

線程中的異常不會自動傳遞到主線程,需要用try-except捕獲處理。gOt28資訊網(wǎng)——每日最新資訊28at.com

def risky_task():    raise ValueError("出錯了!")try:    t = threading.Thread(target=risky_task)    t.start()    t.join()except ValueError as e:    print(f"捕獲到異常: {e}")

確保即使線程出錯,程序也不會突然崩潰。gOt28資訊網(wǎng)——每日最新資訊28at.com

10. 實戰(zhàn)演練:多線程下載

最后,來點實戰(zhàn)吧,比如多線程下載圖片,體驗速度的提升。gOt28資訊網(wǎng)——每日最新資訊28at.com

import requestsimport threadingfrom queue import Queuedef download_image(url):    response = requests.get(url)    with open(f"image_{url[-4:]}", 'wb') as f:        f.write(response.content)    print(f"下載完成:{url}")image_urls = ["http://example.com/image1.jpg", "http://example.com/image2.jpg"]  # 假設(shè)的URLqueue = Queue()threads = []for url in image_urls:    queue.put(url)def worker():    while not queue.empty():        url = queue.get()        download_image(url)        queue.task_done()for _ in range(3):  # 啟動3個下載線程    t = threading.Thread(target=worker)    t.start()    threads.append(t)# 等待所有下載任務(wù)完成for t in threads:    t.join()print("所有圖片下載完成!")

通過隊列分配任務(wù)給多個線程,實現(xiàn)了并行下載,大大提高了效率。gOt28資訊網(wǎng)——每日最新資訊28at.com

好啦,今天的探險就到這里!希望你已經(jīng)對Python多線程有了更深入的理解。gOt28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-89711-0.htmlPython 多線程編程的十個關(guān)鍵概念

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python vs. Rust:打破三大障礙

下一篇: C# 線程池的使用方法

標簽:
  • 熱門焦點
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現(xiàn)了一個流處理程序
  • CSS單標簽實現(xiàn)轉(zhuǎn)轉(zhuǎn)logo

    轉(zhuǎn)轉(zhuǎn)品牌升級后更新了全新的Logo,今天我們用純CSS來實現(xiàn)轉(zhuǎn)轉(zhuǎn)的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個標簽實現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數(shù)或類的行為。裝飾器本質(zhì)上是一個函數(shù),它接受另一個函數(shù)或類作為參數(shù),并返回一個新的函數(shù)或類。它們通常用
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 東方甄選單飛:有些鳥注定是關(guān)不住的

    作者:彭寬鴻來源:華爾街科技眼‍‍‍‍‍‍‍‍‍‍東方甄選創(chuàng)始人俞敏洪帶隊的“7天甘肅行”直播活動已在近日順利收官。成立后一
  • 小米MIX Fold 3配置細節(jié)曝光:搭載領(lǐng)先版驍龍8 Gen2+罕見5倍長焦

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發(fā)布了HarmonyOS 4系統(tǒng),在更流暢的前提下,還帶來了不少新功能,UI設(shè)計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • 華為和江淮汽車合作開發(fā)百萬元問界MPV?雙方回應(yīng)來了

    8月1日消息,郭明錤今天在社交平臺發(fā)文稱,華為正在和江淮汽車合作,開發(fā)售價在100萬元的問界MPV,預(yù)計在2024年第2季度量產(chǎn),銷量目標為上市首年交付5萬輛。
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內(nèi)容審核等。此前,T
Top 主站蜘蛛池模板: 白城市| 无棣县| 武汉市| 罗田县| 巴彦县| 新干县| 祁东县| 舞阳县| 曲周县| 汉中市| 宜丰县| 荣昌县| 高尔夫| 昆山市| 昌江| 鹤岗市| 沁阳市| 天峻县| 黎城县| 延吉市| 双桥区| 东乡族自治县| 木里| 合水县| 安宁市| 健康| 洛川县| 河东区| 刚察县| 罗定市| 临湘市| 成安县| 临泽县| 田东县| 新安县| 阜新| 清新县| 图们市| 洛阳市| 城口县| 通州区|