目錄
Use threading with a queue for more control
Consider asyncio aiohttp for even better I/O performance
Key tips for multi-threading I/O tasks
首頁 後端開發 Python教學 如何在Python中使用多線程進行I/O綁定的任務?

如何在Python中使用多線程進行I/O綁定的任務?

Aug 19, 2025 am 10:41 AM
多執行緒 I/O密集型

对于I/O密集型任务,Python中的多线程能显著提升性能;使用concurrent.futures.ThreadPoolExecutor是推荐方法,它通过管理线程池简化并发操作;1. 使用ThreadPoolExecutor配合max_workers控制线程数,通常设为5–20;2. 用executor.map()并发执行I/O任务并按顺序获取结果,或用submit()与as_completed()处理结果;3. 需要更细控制时可用threading模块加queue.Queue实现持久化工作线程;4. 对高并发I/O,建议改用asyncio与aiohttp以降低开销;5. 避免过多线程、注意异常处理、使用线程安全的日志和共享数据机制;ThreadPoolExecutor适用于大多数场景,只有在需要更高性能或更精细控制时才选用底层方法或异步方案。

How to use multi-threading for I/O-bound tasks in Python?

For I/O-bound tasks in Python—like making HTTP requests, reading files, or querying databases—using multi-threading can significantly improve performance by allowing your program to wait for multiple I/O operations concurrently, rather than one at a time.

Because of the Global Interpreter Lock (GIL) in CPython, multi-threading doesn’t speed up CPU-heavy tasks, but it works very well for I/O-bound work since threads can yield control while waiting for external resources.

Here’s how to use multi-threading effectively for I/O-bound tasks:


Use concurrent.futures.ThreadPoolExecutor

The easiest and most modern way is to use ThreadPoolExecutor from the concurrent.futures module. It manages a pool of threads and lets you submit tasks without dealing with low-level thread management.

import concurrent.futures
import requests

def fetch_url(url):
    response = requests.get(url)
    return len(response.content)

urls = [
    "https://httpbin.org/delay/1",
    "https://httpbin.org/delay/2",
    "https://httpbin.org/delay/1",
]

# Use ThreadPoolExecutor to run I/O tasks in parallel
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    results = list(executor.map(fetch_url, urls))

print(results)
  • max_workers controls how many threads are created. A common choice is 5–20 for I/O tasks, depending on the system and task type.
  • executor.map() runs the function on each URL concurrently and returns results in order.
  • Alternatives: executor.submit() as_completed() if you want to process results as they finish.

Use threading with a queue for more control

If you need more fine-grained control (e.g., long-running worker threads), you can use the threading module with a queue.Queue.

import threading
import queue
import requests
import time

def worker(q):
    while True:
        url = q.get()
        if url is None:
            break
        try:
            response = requests.get(url)
            print(f"Fetched {url}: {response.status_code}")
        except Exception as e:
            print(f"Error fetching {url}: {e}")
        finally:
            q.task_done()

# Set up queue and threads
q = queue.Queue()
num_threads = 5

# Start worker threads
threads = []
for _ in range(num_threads):
    t = threading.Thread(target=worker, args=(q,))
    t.start()
    threads.append(t)

# Add URLs to the queue
urls = ["https://httpbin.org/get"] * 10
for url in urls:
    q.put(url)

# Wait for all tasks to complete
q.join()

# Stop workers
for _ in range(num_threads):
    q.put(None)
for t in threads:
    t.join()

This pattern is useful when you have a continuous stream of I/O tasks or want persistent workers.


Consider asyncio aiohttp for even better I/O performance

While threading works well, for high-volume I/O (e.g., hundreds of HTTP requests), an asynchronous approach using asyncio is often more efficient because it avoids thread overhead.

Example with aiohttp:

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = ["https://httpbin.org/get"] * 10
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        responses = await asyncio.gather(*tasks)
    return responses

# Run it
results = asyncio.run(main())
  • No threading, no GIL contention.
  • Much lower memory and CPU overhead per operation.
  • Steeper learning curve due to async/await syntax.

Key tips for multi-threading I/O tasks

  • Don’t use too many threads: 10–50 is usually enough. Thousands can hurt performance due to overhead.
  • Handle exceptions in threads: Uncaught exceptions in threads can fail silently.
  • Use thread-safe logging: If logging from multiple threads, use logging safely (the logging module is thread-safe by default).
  • Avoid shared mutable state: If threads must share data, use queue.Queue or locks (threading.Lock).
  • Prefer ThreadPoolExecutor for simple cases—it’s clean and robust.

Basically, for I/O-bound tasks, ThreadPoolExecutor is the go-to for most Python developers. It’s simple, effective, and handles the complexity for you. Only go lower-level or switch to asyncio when you need finer control or higher throughput.

以上是如何在Python中使用多線程進行I/O綁定的任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

C++ 函式異常與多執行緒:並發環境下的錯誤處理 C++ 函式異常與多執行緒:並發環境下的錯誤處理 May 04, 2024 pm 04:42 PM

C++中函數異常處理對於多執行緒環境特別重要,以確保執行緒安全性和資料完整性。透過try-catch語句,可以在出現異常時擷取和處理特定類型的異常,以防止程式崩潰或資料損壞。

PHP 多執行緒如何實作? PHP 多執行緒如何實作? May 06, 2024 pm 09:54 PM

PHP多執行緒是指在一個行程中同時執行多個任務,透過建立獨立運行的執行緒實作。 PHP中可以使用Pthreads擴充模擬多執行緒行為,安裝後可使用Thread類別建立和啟動執行緒。例如,處理大量資料時,可將資料分割為多個區塊,並建立對應數量的執行緒同時處理,提高效率。

C++ 記憶體管理在多執行緒環境中的挑戰與應對措施? C++ 記憶體管理在多執行緒環境中的挑戰與應對措施? Jun 05, 2024 pm 01:08 PM

在多執行緒環境中,C++記憶體管理面臨以下挑戰:資料競爭、死鎖和記憶體洩漏。因應措施包括:1.使用同步機制,如互斥鎖和原子變數;2.使用無鎖資料結構;3.使用智慧指標;4.(可選)實現垃圾回收。

PHP 函數在多執行緒環境中的行為如何? PHP 函數在多執行緒環境中的行為如何? Apr 16, 2024 am 10:48 AM

在多執行緒環境中,PHP函數的行為取決於其類型:普通函數:執行緒安全,可並發執行。修改全域變數的函數:不安全,需使用同步機制。文件操作函數:不安全,需使用同步機制協調存取。資料庫操作函數:不安全,需使用資料庫系統機制防止衝突。

Java函數的並發和多執行緒如何提高效能? Java函數的並發和多執行緒如何提高效能? Apr 26, 2024 pm 04:15 PM

使用Java函數的並發和多執行緒技術可以提升應用程式效能,包括以下步驟:理解並發和多執行緒概念。利用Java的並發和多執行緒函式庫,如ExecutorService和Callable。實作多執行緒矩陣乘法等案例,大幅縮短執行時間。享受並發和多執行緒帶來的應用程式響應速度提升和處理效率優化等優勢。

JUnit單元測試框架在多執行緒環境中的用法 JUnit單元測試框架在多執行緒環境中的用法 Apr 18, 2024 pm 03:12 PM

在多執行緒環境中使用JUnit時,有兩種常見方法:單執行緒測試和多執行緒測試。單執行緒測試在主執行緒上運行,避免並發問題,而多執行緒測試在工作執行緒上運行,需要同步測試方法來確保共享資源不受干擾。常見使用案例包括測試多執行緒安全方法,例如使用ConcurrentHashMap儲存鍵值對,並發執行緒對鍵值對進行操作並驗證其正確性,體現了多執行緒環境中JUnit的應用。

C++中如何處理多執行緒中的共享資源? C++中如何處理多執行緒中的共享資源? Jun 03, 2024 am 10:28 AM

C++中使用互斥量(mutex)處理多執行緒共享資源:透過std::mutex建立互斥量。使用mtx.lock()取得互斥量,對共享資源進行排他存取。使用mtx.unlock()釋放互斥。

C++ 多執行緒程式設計中調試和故障排除的技術 C++ 多執行緒程式設計中調試和故障排除的技術 Jun 03, 2024 pm 01:35 PM

C++多執行緒程式設計的除錯技巧包括:使用資料競爭分析器來偵測讀寫衝突,並使用同步機制(如互斥鎖)解決。使用線程調試工具檢測死鎖,並透過避免嵌套鎖和使用死鎖檢測機制來解決。使用數據競爭分析器檢測數據競爭,並透過將寫入操作移入關鍵段或使用原子操作來解決。使用效能分析工具測量上下文切換頻率,並透過減少執行緒數量、使用執行緒池和卸載任務來解決過高的開銷。

See all articles