成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 多線程編程的十個關鍵概念

開發
今天我們要一起探索的是Python編程中的一個超炫酷領域——多線程,希望能對Python多線程有更深入的理解。

今天我們要一起探索的是Python編程中的一個超炫酷領域——多線程!想象一下,你的程序能像超人一樣同時處理多個任務,是不是很激動人心?讓我們以輕松愉快的方式,一步步揭開它的神秘面紗。

1. 線程的初步認知

想象你是個廚房大廚,一邊炒菜一邊洗菜,這就是多線程的日常。在Python里,threading模塊就是我們的廚房神器。

import threading

def cook():  # 炒菜線程
    print("炒菜中...")
    
def wash():  # 洗菜線程
    print("洗菜中...")

# 創建線程對象
thread1 = threading.Thread(target=cook)
thread2 = threading.Thread(target=wash)

# 啟動線程
thread1.start()
thread2.start()

# 等待所有線程完成
thread1.join()
thread2.join()

print("飯做好啦!")

這段代碼中,Thread類用來創建線程,target參數指定線程要執行的函數。start()讓線程開始執行,而join()確保主線程等待這些小線程們完成它們的任務。

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

在多線程世界,如果兩個線程同時操作同一資源(比如共享食材),就可能出亂子。這時就需要“鎖”來幫忙了,Python里的鎖叫Lock。

import threading

shared_resource = 0
lock = threading.Lock()

def increase(): 
    global shared_resource
    lock.acquire()  # 上鎖,防止同時訪問
    shared_resource += 1
    lock.release()  # 解鎖,釋放控制權

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()解鎖,這樣就避免了數據混亂。

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

但鎖用不好也會出問題,就像兩個廚師互相等待對方手中的鍋,形成了死鎖。要小心設計,避免循環等待。

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

想象一下,如果你每次炒菜都要新雇一個廚師,那得多浪費?線程池(ThreadPoolExecutor)就是解決這個問題的神器,它預先創建好一些線程,重復利用。

from concurrent.futures import ThreadPoolExecutor

def task(n):
    print(f"執行任務{n}")

with ThreadPoolExecutor(max_workers=5) as executor:
    executor.map(task, range(1, 6))

這里,ThreadPoolExecutor創建了一個最多有5個線程的池,map()函數并行執行任務列表中的每個任務。

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

守護線程就像廚房的清潔工,在所有其他線程完成后默默清理。通過setDaemon(True)設置線程為守護線程。

def cleaner():
    while True:  # 假設這是一個無限循環,清理任務
        print("打掃廚房...")
        if not other_threads_running():  # 假定函數檢查其他線程是否還在運行
            break

clean_thread = threading.Thread(target=cleaner)
clean_thread.setDaemon(True)
clean_thread.start()

# 其他線程的代碼...

print("廚房關閉,清潔完成。")

6. 線程優先級:誰先炒誰先洗

雖然Python標準庫沒有直接提供線程優先級的功能,但可以通過隊列等間接實現。不過,大多數情況下,Python的線程調度是公平的,不需要擔心。

7. 全局解釋器鎖(GIL)

Python的GIL是一個讓人又愛又恨的東西,它保證了任何時刻只有一個線程在執行Python字節碼,這對多核CPU來說不是個好消息。但在I/O密集型任務中,GIL的影響沒那么大。

8. 線程局部存儲:我的調料我做主

不同線程需要不同的“調料”怎么辦?threading.local()來幫忙,它提供了線程本地的存儲空間。

import threading

local_data = threading.local()

def set_data():
    local_data.value = "這是我的調料"

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,互不影響。

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

線程中的異常不會自動傳遞到主線程,需要用try-except捕獲處理。

def risky_task():
    raise ValueError("出錯了!")

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

確保即使線程出錯,程序也不會突然崩潰。

10. 實戰演練:多線程下載

最后,來點實戰吧,比如多線程下載圖片,體驗速度的提升。

import requests
import threading
from queue import Queue

def 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"]  # 假設的URL
queue = 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)

# 等待所有下載任務完成
for t in threads:
    t.join()

print("所有圖片下載完成!")

通過隊列分配任務給多個線程,實現了并行下載,大大提高了效率。

好啦,今天的探險就到這里!希望你已經對Python多線程有了更深入的理解。

責任編輯:趙寧寧 來源: 手把手PythonAI編程
相關推薦

2024-11-01 08:00:00

2023-10-29 17:12:26

Python編程

2024-02-04 17:21:37

C++編程開發

2024-05-21 12:18:57

Python代碼重構

2024-01-30 00:40:10

2024-05-17 12:43:49

Python編程開發

2023-04-20 18:45:44

2009-07-03 17:09:01

學習Tapestry

2019-02-01 10:05:33

開源游戲開發游戲引擎

2023-06-05 07:56:10

線程分配處理器

2024-10-16 12:51:56

2021-03-11 09:02:37

SQL數據庫數據

2024-09-23 12:00:00

Python編程

2024-11-11 08:00:00

PyTorch深度學習

2023-05-28 22:48:29

程序員編程

2022-03-09 09:43:20

并發編程Java

2022-08-16 08:27:20

線程毀線程異步

2022-06-12 23:43:19

SQL數據函數

2024-11-29 08:00:00

代碼安全代碼Python

2025-06-11 08:25:00

Python編程開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av香蕉 | 成人免费一区二区三区牛牛 | 亚洲精品福利视频 | 日韩高清在线观看 | 久草在线在线精品观看 | 欧美黑人又粗大 | 亚洲国产二区 | www.伊人.com| 日韩精品视频在线免费观看 | 免费黄色在线观看 | 国产男女视频 | 一区免费观看 | 欧美精品久久 | 一区二区在线免费播放 | 婷婷久久网| 久久久久久久一区 | 在线中文一区 | 日韩视频区 | 午夜av影院| 久久国产精品久久久久 | 成人免费大片黄在线播放 | 精品福利在线视频 | 国产一级视频在线 | 成人在线精品 | 久久精品欧美一区二区三区不卡 | 午夜丁香视频在线观看 | 99亚洲精品| 欧美日韩在线观看视频 | 精品成人佐山爱一区二区 | 97色在线观看免费视频 | 欧美中文一区 | 午夜精品网站 | 国产精品一级在线观看 | 四虎最新地址 | 黑人巨大精品欧美一区二区免费 | 天天干国产 | 日韩综合在线 | 青青艹在线视频 | 欧美a∨ | 国产午夜影院 | 欧美在线看片 |