python 并發 異常處理 多線程 多進程 協程
多線程
在多線程環境中,每個線程都有自己的執行流和棧。異常發生時,通常只會影響該特定線程。為了處理線程中的異常,可以使用 threading.Thread() 的 join() 方法或 Thread.exc_info 屬性。
import threading
def worker_thread(name):
print(f"{name}: Starting")
raise RuntimeError("Error in thread")
try:
threads = []
for i in range(5):
thread = threading.Thread(target=worker_thread, args=(f"Thread {i}",))
threads.append(thread)
for thread in threads:
thread.start()
thread.join()
except RuntimeError as exc:
print(f"Main thread: Exception occurred in child thread: {exc}")
登錄后復制
多進程
在多進程環境中,每個進程都有自己獨立的內存空間和執行流。異常發生時,它會影響整個進程。要處理進程中的異常,可以使用 multiprocessing.Process() 的 join() 方法或 Process.exitcode 屬性。
import multiprocessing
def worker_process(name):
print(f"{name}: Starting")
raise RuntimeError("Error in process")
try:
processes = []
for i in range(5):
process = multiprocessing.Process(target=worker_process, args=(f"Process {i}",))
processes.append(process)
for process in processes:
process.start()
process.join()
except RuntimeError as exc:
print(f"Main process: Exception occurred in child process: {exc}")
登錄后復制
協程
協程是輕量級線程,在單線程環境中執行。異常發生時,它會傳播到協程的調用者。要處理協程中的異常,可以使用 asyncio.Task.exception() 方法。
import asyncio
async def worker_coroutine(name):
print(f"{name}: Starting")
raise RuntimeError("Error in coroutine")
async def main():
tasks = []
for i in range(5):
task = asyncio.create_task(worker_coroutine(f"Coroutine {i}"))
tasks.append(task)
for task in tasks:
try:
await task
except RuntimeError as exc:
print(f"Main coroutine: Exception occurred in child coroutine: {exc}")
asyncio.run(main())
登錄后復制
最佳實踐
始終捕獲并處理異常,避免程序崩潰。
使用明確的異常類型,傳達清晰的錯誤信息。
考慮使用異常日志記錄機制來跟蹤和分析異常。
使用子類化異?;蜃远x異常類來創建特定的異常類型。
在并發應用程序中,使用線程安全的數據結構和同步機制來避免數據爭用。
結論
在 Python 并發中,異常處理至關重要,因為它可以確保應用程序在異常情況下保持穩定和可靠。通過掌握多線程、多進程和協程中的異常處理技術,開發人員可以構建健壯且可靠的并發應用程序。始終記住捕獲和處理異常,并遵循最佳實踐,以提高應用程序的整體質量和用戶體驗。






