python 線程池順序執(zhí)行的方法實(shí)現(xiàn)
在Python中,線程池(ThreadPoolExecutor)默認(rèn)是并發(fā)執(zhí)行任務(wù)的,但若需要實(shí)現(xiàn)任務(wù)的順序執(zhí)行(按提交順序執(zhí)行或按結(jié)果順序處理),可以通過以下方案實(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)文章
python在協(xié)程中增加任務(wù)實(shí)例操作
在本篇文章里小編給大家整理的是一篇關(guān)于python在協(xié)程中增加任務(wù)實(shí)例操作內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02
python使用paramiko實(shí)現(xiàn)ssh的功能詳解
這篇文章主要介紹了python使用paramiko實(shí)現(xiàn)ssh的功能詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python實(shí)現(xiàn)字符串逆序輸出功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)字符串逆序輸出功能,結(jié)合具體實(shí)例形式分析了Python針對(duì)字符串的遍歷、翻轉(zhuǎn)、排序等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
實(shí)用自動(dòng)化運(yùn)維Python腳本分享
今天小編就為大家分享一篇實(shí)用自動(dòng)化運(yùn)維Python腳本。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python實(shí)現(xiàn)Excel報(bào)表自動(dòng)化的實(shí)踐教程
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)Excel報(bào)表自動(dòng)化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-03-03
python 按照固定長(zhǎng)度分割字符串的方法小結(jié)
這篇文章主要介紹了借助python腳本,可以輕松實(shí)現(xiàn),原理就是:字符串的按照固定長(zhǎng)度拆分2018-04-04
python用pyecharts實(shí)現(xiàn)地圖數(shù)據(jù)可視化
這篇文章主要介紹了python用pyecharts實(shí)現(xiàn)地圖數(shù)據(jù)可視化,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03

