python 線程池順序執(zhí)行的方法實(shí)現(xiàn)
在Python中,線程池(ThreadPoolExecutor
)默認(rèn)是并發(fā)執(zhí)行任務(wù)的,但若需要實(shí)現(xiàn)任務(wù)的順序執(zhí)行(按提交順序執(zhí)行或按結(jié)果順序處理),可以通過(guò)以下方案實(shí)現(xiàn):
方案一:強(qiáng)制單線程(偽順序執(zhí)行)
將線程池的最大工作線程數(shù)設(shè)為1,任務(wù)會(huì)按提交順序依次執(zhí)行(但失去了并發(fā)意義):
from concurrent.futures import ThreadPoolExecutor def task(n): return f"Task {n} completed" with ThreadPoolExecutor(max_workers=1) as executor: # 單線程 futures = [executor.submit(task, i) for i in range(1, 6)] for future in futures: print(future.result())
方案二:按提交順序獲取結(jié)果
保持并發(fā)執(zhí)行,但按任務(wù)提交順序獲取結(jié)果(若任務(wù)完成順序不確定):
from concurrent.futures import ThreadPoolExecutor def task(n): import time, random time.sleep(random.uniform(0, 1)) # 模擬隨機(jī)耗時(shí) return f"Task {n} completed" with ThreadPoolExecutor() as executor: # 提交任務(wù)并按順序存儲(chǔ) Future 對(duì)象 futures = [executor.submit(task, i) for i in range(1, 6)] # 按提交順序逐個(gè)獲取結(jié)果(會(huì)阻塞直到對(duì)應(yīng)任務(wù)完成) for future in futures: print(future.result()) # 輸出順序始終是 1,2,3,4,5
方案三:任務(wù)間依賴控制
若任務(wù)需要嚴(yán)格按順序執(zhí)行(前一個(gè)任務(wù)完成后才能執(zhí)行下一個(gè)),使用同步鎖:
from concurrent.futures import ThreadPoolExecutor import threading lock = threading.Lock() current_step = 0 def sequential_task(n): global current_step while True: with lock: if n == current_step + 1: print(f"Executing Task {n}") current_step = n break with ThreadPoolExecutor(max_workers=5) as executor: executor.map(sequential_task, range(1, 6)) # 嚴(yán)格按 1→2→3→4→5 執(zhí)行
方案四:隊(duì)列順序消費(fèi)
使用隊(duì)列(Queue
)控制任務(wù)執(zhí)行順序:
from concurrent.futures import ThreadPoolExecutor import queue def worker(q): while not q.empty(): task_id = q.get() print(f"Processing Task {task_id}") q.task_done() task_queue = queue.Queue() for i in range(1, 6): task_queue.put(i) with ThreadPoolExecutor() as executor: # 啟動(dòng)多個(gè)線程消費(fèi)隊(duì)列(實(shí)際按隊(duì)列順序執(zhí)行) for _ in range(3): # 3個(gè)工作線程 executor.submit(worker, task_queue) task_queue.join() # 等待所有任務(wù)完成
適用場(chǎng)景總結(jié)
方案 | 特點(diǎn) | 適用場(chǎng)景 |
---|---|---|
單線程池 | 簡(jiǎn)單但無(wú)并發(fā) | 調(diào)試或資源受限環(huán)境 |
順序獲取結(jié)果 | 并發(fā)執(zhí)行,順序處理結(jié)果 | 結(jié)果需按提交順序處理(如日志寫入) |
任務(wù)間依賴鎖 | 嚴(yán)格順序執(zhí)行 | 任務(wù)有前后依賴關(guān)系 |
隊(duì)列消費(fèi) | 動(dòng)態(tài)任務(wù)按隊(duì)列順序執(zhí)行 | 生產(chǎn)者-消費(fèi)者模型 |
根據(jù)需求選擇最合適的方法,通常方案二(順序獲取結(jié)果)能滿足大多數(shù)場(chǎng)景。
到此這篇關(guān)于python 線程池順序執(zhí)行的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python 線程池順序執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django中如何使用Celery執(zhí)行異步任務(wù)
這篇文章主要介紹了Django中如何使用Celery執(zhí)行異步任務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11win7上python2.7連接mysql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了win7上python2.7連接mysql數(shù)據(jù)庫(kù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01詳解python opencv、scikit-image和PIL圖像處理庫(kù)比較
這篇文章主要介紹了詳解python opencv、scikit-image和PIL圖像處理庫(kù)比較,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12python實(shí)現(xiàn)兩個(gè)一維列表合并成一個(gè)二維列表
今天小編就為大家分享一篇python實(shí)現(xiàn)兩個(gè)一維列表合并成一個(gè)二維列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12用pip給python安裝matplotlib庫(kù)的詳細(xì)教程
這篇文章主要介紹了用pip給python安裝matplotlib庫(kù)的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02