欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中六大超時處理方法介紹

 更新時間:2025年01月19日 10:08:52   作者:孤寒者  
在?Python?中,超時處理是一項非常常見的需求,尤其是在處理阻塞任務或并發(fā)任務時,本文整理了大家常用的六大超時處理方法,感興趣的小伙伴可以參考下

Python 中常見的超時處理方法

在 Python 中,超時處理是一項非常常見的需求,尤其是在處理阻塞任務或并發(fā)任務時。以下是幾種常用的超時處理方法,每種方法適用于不同的場景。

1. signal 模塊

適用場景:當需要對單個阻塞任務進行超時控制時,尤其是 CPU 密集型任務。通常用于限制一個長期運行的操作(例如復雜的計算任務)。

優(yōu)點:

  • 無需額外安裝依賴,直接使用 Python 標準庫。
  • 簡潔易用,適合處理單一阻塞任務的超時控制。

缺點:

  • 不支持多線程或多進程,無法處理并發(fā)任務。
  • Windows 平臺不支持 SIGALRM,因此此方法在 Windows 上無法使用。

適用場景:

適合在 UNIX-like 系統(tǒng)上對簡單的阻塞任務進行超時限制,如網絡請求、文件讀取等。

示例:

import signal


def handler(signum, frame):
    """
    定義信號處理函數(shù) handler,當接收到一個信號時,這個函數(shù)會被調用。在函數(shù)內部,拋出 TimeoutError 異常,表示操作超時。

    signum:表示接收到的信號編號(在本例中是 SIGALRM 信號)。
    frame:是當前的堆棧幀信息,我們在這個示例中并不使用它。
    當 handler 被調用時,它會拋出一個 TimeoutError 異常,表示任務超時。
    """
    raise TimeoutError("操作超時")


signal.signal(signal.SIGALRM, handler)
# 通過 signal.signal() 函數(shù)將 SIGALRM 信號與 handler 關聯(lián)。即:當程序接收到 SIGALRM 信號時,會執(zhí)行 handler 函數(shù)。
# SIGALRM 是一個定時信號,通常用于指定某個操作的超時時間。在這個例子中,下面我會設置一個定時器,讓它在 5 秒后發(fā)送 SIGALRM 信號。
signal.alarm(5)
# 設置一個定時器,定時器將在 5 秒后向當前進程發(fā)出一個 SIGALRM 信號。

try:
    while True:  # 模擬長時間運行的任務
        pass
except TimeoutError:
    print("操作超時")
finally:
    signal.alarm(0)  # 取消定時器,防止程序結束后定時器仍然生效。

設置信號處理器:signal.signal(signal.SIGALRM, handler) 讓程序在接收到 SIGALRM 信號時執(zhí)行 handler 函數(shù)。

啟動定時器:signal.alarm(5) 啟動一個定時器,在 5 秒后發(fā)送 SIGALRM 信號。

模擬長時間任務:while True: pass 模擬一個無限循環(huán),表示一個長時間運行的任務。

觸發(fā)超時:在 5 秒后,SIGALRM 信號會被發(fā)送,handler 函數(shù)會被調用,拋出 TimeoutError 異常。

捕獲超時異常:except TimeoutError: 捕獲超時異常,并打印 “操作超時”。

取消定時器:finally: signal.alarm(0) 取消定時器,避免定時器在任務完成后繼續(xù)觸發(fā)。

注意:在 Windows 上會報錯 AttributeError: module 'signal' has no attribute 'SIGALRM'。此方法僅適用于 UNIX-like 系統(tǒng)。

2. threading 模塊

適用場景:適合并發(fā)執(zhí)行獨立任務的場景,特別是當每個任務的執(zhí)行時間需要控制時。適用于多線程并發(fā)處理任務。

優(yōu)點:

  • 支持多線程,適合獨立的并發(fā)任務。
  • 靈活的超時處理,可以通過 Timer 定時器設置任務超時。

缺點:

  • 線程管理較為復雜,涉及顯式創(chuàng)建和控制線程。
  • 相比 asyncio 和其他異步框架,線程開銷較大,可能導致資源競爭和上下文切換。

適用場景:

適合任務之間相對獨立,且需要并發(fā)執(zhí)行的場景,如并行任務、爬蟲等。

示例:

通過創(chuàng)建兩個線程來同時執(zhí)行一個長時間運行的任務和超時處理功能~

import threading
import time


def task():
    time.sleep(10)  # 模擬長時間任務
    return "任務完成"


def timeout_fun():
    print("任務超時")


timeout_time = 5
t1 = threading.Thread(target=task)
t2 = threading.Timer(timeout_time, timeout_fun)
# 創(chuàng)建一個定時器 t2,它會在 5 秒后執(zhí)行 timeout_fun() 函數(shù)。如果任務在 5 秒內未完成,timeout_fun 就會被調用,打印超時信息。

t1.start()
t2.start()

t1.join()
# 會讓主線程等待 t1 線程完成執(zhí)行。如果 t1 在 10 秒內完成,主線程才會繼續(xù)執(zhí)行下一步。如果 t1 超過了 10 秒,主線程會繼續(xù)等待。
t2.cancel()  
# 取消定時器 t2,如果 t1 任務在 5 秒內完成,定時器 t2 會被取消,防止超時處理函數(shù) timeout_fun() 被觸發(fā)。

任務線程啟動:t1 開始執(zhí)行 task(),模擬長時間運行的任務。

定時器啟動:t2 啟動并在 5 秒后觸發(fā)超時處理。

任務超時處理:如果任務 t1 在 5 秒內沒有完成,定時器 t2 會觸發(fā)并執(zhí)行 timeout_fun(),打印 “任務超時”。

任務完成:如果任務在 5 秒內完成,t2.cancel() 會被調用,取消超時處理。

3. concurrent.futures 模塊

適用場景:適合處理多個并發(fā)任務的超時控制,尤其是涉及 I/O 密集型任務時。該模塊簡化了線程池和進程池的管理,適合有多個任務并發(fā)執(zhí)行的情況。

優(yōu)點:

  • 提供了線程池和進程池的高層次接口,簡化并發(fā)任務的管理。
  • 內置超時控制,可以直接指定任務的超時時間。
  • 支持并發(fā)執(zhí)行,易于實現(xiàn)任務的并發(fā)和超時控制。

缺點:

  • 進程池和線程池的性能在不同場景下有所差異,需要根據(jù)任務特點選擇合適的池類型。
  • 如果任務較少或簡單,使用 concurrent.futures 可能顯得稍復雜。

適用場景:

當有多個并發(fā)任務需要執(zhí)行,并且每個任務的超時時間需要控制時,可以使用此模塊。

示例:

import concurrent.futures
import time


def task():
    time.sleep(10)  # 模擬長時間任務
    return "任務完成"


with concurrent.futures.ThreadPoolExecutor() as executor:
    future = executor.submit(task)
    # submit() 方法異步提交任務并返回一個 Future 對象,F(xiàn)uture 對象提供了管理任務的接口,比如獲取任務結果或設置超時等。
    try:
        result = future.result(timeout=5)
        # 用來獲取 task() 函數(shù)的執(zhí)行結果。timeout=5 表示最多等待 5 秒鐘,如果在 5 秒內任務沒有完成,就會拋出 TimeoutError 異常。
        # 如果 task() 在 5 秒內完成,future.result() 會返回任務的返回值(即 "任務完成"),然后打印出結果。
        print(result)
    except concurrent.futures.TimeoutError:
        print("任務超時")

4. asyncio 模塊

適用場景:適合 I/O 密集型任務,特別是需要并發(fā)處理的異步任務。適用于需要高并發(fā)的場景,如異步網絡請求、文件 I/O、數(shù)據(jù)庫操作等。

優(yōu)點:

  • 非常高效,尤其適合處理 I/O 密集型任務,能夠實現(xiàn)大量任務的并發(fā)。
  • 異步編程模式(async/await)讓代碼結構清晰且易于管理。

缺點:

  • 需要理解和掌握異步編程,可能對不熟悉異步模型的開發(fā)者有一定門檻。
  • 對 CPU 密集型任務不適用,因為 asyncio 并不通過多核來并行處理任務。

適用場景:

當任務是 I/O 密集型且需要高并發(fā)時(如處理大量并發(fā)請求或文件操作),asyncio 是理想的選擇。

示例:

import asyncio


async def task():
    await asyncio.sleep(10)
    # 模擬一個長時間運行的異步任務,asyncio.sleep(10) 會讓當前任務掛起 10 秒,在這段時間內不會占用 CPU 資源。類似于 time.sleep(),但它是非阻塞的,因此可以在等待時繼續(xù)執(zhí)行其他任務。
    return "任務完成"


async def main():
    try:
        result = await asyncio.wait_for(task(), timeout=5)
        # asyncio.wait_for() 用來執(zhí)行 task() 并設置超時。如果 task() 在指定的時間內(這里是 5 秒)完成,wait_for 會返回 task() 的結果(即 "任務完成")。
        print(result)
    except asyncio.TimeoutError:
        print("任務超時")


asyncio.run(main())
# 用來啟動事件循環(huán)并執(zhí)行 main() 協(xié)程。asyncio.run() 會創(chuàng)建一個新的事件循環(huán),運行傳入的協(xié)程,直到協(xié)程執(zhí)行完畢并返回結果。這個方法會自動管理事件循環(huán)的創(chuàng)建和關閉。

5. eventlet

適用場景:適用于需要處理高并發(fā)的 I/O 密集型任務,特別是在需要大量并發(fā)請求時。適合用來構建高并發(fā)的 Web 服務器或網絡爬蟲。

優(yōu)點:

  • 高效的綠色線程模型,能夠以較低的資源消耗處理大量并發(fā)任務。
  • 特別適用于 I/O 密集型任務,減少線程和進程的開銷。

缺點:

  • 需要額外安裝第三方庫 eventlet。
  • 對 CPU 密集型任務性能較差,因為其通過協(xié)程模擬并發(fā),無法利用多核 CPU。

適用場景:

高并發(fā) I/O 密集型任務,尤其是需要在同一線程中處理大量并發(fā)請求的場景。

示例:

import eventlet


def long_task():
    eventlet.sleep(10)
    # 通過 eventlet.sleep(10) 模擬一個阻塞的操作,實際上是讓出當前綠色線程 10 秒鐘。
    # 注意:eventlet.sleep() 并不是真的讓程序進入休眠,它讓出控制權,使得其他綠色線程可以執(zhí)行。這是 eventlet 模擬并發(fā)的方式。
    return "任務完成"


def task_with_timeout():
    pool = eventlet.GreenPool()  # 創(chuàng)建綠色線程池
    result = pool.spawn(long_task)
    # spawn() 方法會異步地執(zhí)行 long_task,并返回一個 GreenThread 對象。這個對象表示正在運行的綠色線程。
    try:
        # wait() 方法會阻塞當前線程,直到綠色線程執(zhí)行完畢并返回結果。它的 timeout 參數(shù)用于設置最大等待時間,這里設置為 5 秒。如果綠色線程在 5 秒內沒有完成,wait() 方法會拋出 eventlet.timeout.Timeout 異常。
        return result.wait(timeout=5)  # 設置超時時間為5秒
    except eventlet.timeout.Timeout:
        return "任務超時"


print(task_with_timeout())

6. func-timeout

適用場景:當你需要限制某個單獨函數(shù)的執(zhí)行時間,尤其是任務本身可能是阻塞型的。

優(yōu)點:

  • 極簡的接口,專門用于控制函數(shù)的超時,使用方便。
  • 不需要處理多線程或并發(fā)任務,簡單直觀。

缺點:

  • 僅適用于單個函數(shù),無法處理多個任務或并發(fā)任務的超時。
  • 不支持多線程或進程池的管理。

適用場景:

當你只需要對某個特定函數(shù)進行超時控制時,func-timeout 非常方便。

示例:

from func_timeout import func_timeout, FunctionTimedOut


def long_task():
    import time
    time.sleep(10)  # 模擬長時間任務
    return "任務完成"


try:
    result = func_timeout(5, long_task)  # 設置超時時間為5秒
    print(result)
except FunctionTimedOut:
    print("任務超時")

總結對比:

方法適用場景優(yōu)點缺點
signal單一阻塞任務的超時簡單直接,適用于 UNIX-like 系統(tǒng)不支持多線程,無法處理并發(fā)任務,僅適用于 UNIX-like 系統(tǒng)
threading多線程任務并發(fā)執(zhí)行靈活支持多線程,適合獨立任務線程管理復雜,開銷較大,可能出現(xiàn)資源競爭
concurrent.futures多并發(fā)任務并行執(zhí)行高層次接口,線程池/進程池管理簡潔,支持超時控制對任務較少時可能過于復雜,線程和進程開銷較大
asyncio異步 I/O 密集型任務高效處理 I/O 密集型任務,適合大量并發(fā)異步編程模型有學習曲線,不適合 CPU 密集型任務
Eventlet高并發(fā) I/O 密集型任務高效的綠色線程管理,低資源消耗不支持 CPU 密集型任務,額外安裝依賴
func-timeout單獨函數(shù)的超時控制極簡接口,快速實現(xiàn)超時控制僅適用于單個函數(shù),無法處理并發(fā)任務

到此這篇關于Python中六大超時處理方法介紹的文章就介紹到這了,更多相關Python超時處理方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python使用arp欺騙偽造網關的方法

    python使用arp欺騙偽造網關的方法

    這篇文章主要介紹了python使用arp欺騙偽造網關的方法,涉及Python偽造網關的相關技巧,需要的朋友可以參考下
    2015-04-04
  • Flask與數(shù)據(jù)庫的交互插件Flask-Sqlalchemy的使用

    Flask與數(shù)據(jù)庫的交互插件Flask-Sqlalchemy的使用

    在構建Web應用時,與數(shù)據(jù)庫的交互是必不可少的部分,本文主要介紹了Flask與數(shù)據(jù)庫的交互插件Flask-Sqlalchemy的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Flask配置四種方式

    Flask配置四種方式

    Flask提供了多種配置方式,可以根據(jù)不同的需求和場景進行選擇,包括配置類方式、配置文件方式、環(huán)境變量方式和實例文件方式,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 淺談spring boot 集成 log4j 解決與logback沖突的問題

    淺談spring boot 集成 log4j 解決與logback沖突的問題

    今天小編就為大家分享一篇淺談spring boot 集成 log4j 解決與logback沖突的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python用?matplotlib?繪制柱狀圖

    Python用?matplotlib?繪制柱狀圖

    這篇文章主要介紹了Python如何用?matplotlib?繪制柱狀圖,文章對matplotlib模塊中詳細學習繪制各種柱狀圖標相關屬性和方法,在遇到需要直觀展示離散數(shù)據(jù)點的差異時,我們可以使用bar()或者barh()繪制美觀的圖表。具有一定的參考價值,需要的朋友可以參考一下
    2021-12-12
  • python 中文編碼亂碼問題的解決

    python 中文編碼亂碼問題的解決

    中文編碼問題一直是程序員頭疼的問題,本文將盡量用通俗的語言帶大家徹底的了解字符編碼以及Python2和3中的各種編碼問題。感興趣的可以了解一下
    2021-11-11
  • Python 列表的基本操作介紹

    Python 列表的基本操作介紹

    這篇文章主要介紹了Python 列表的基本操作,下面文章圍繞Python 列表的相關資料展開文章的詳細內容,,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • Python 測試框架unittest和pytest的優(yōu)劣

    Python 測試框架unittest和pytest的優(yōu)劣

    這篇文章主要介紹了Python 測試框架unittest和pytest的優(yōu)劣,幫助大家更好的進行python程序的測試,感興趣的朋友可以了解下
    2020-09-09
  • 基于web管理OpenVPN服務的安裝使用詳解

    基于web管理OpenVPN服務的安裝使用詳解

    這篇文章主要為大家介紹了基于web管理OpenVPN服務的安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Python2與Python3的區(qū)別詳解

    Python2與Python3的區(qū)別詳解

    這篇文章主要介紹了Python2與Python3的區(qū)別詳解,需要的朋友可以參考下
    2020-02-02

最新評論