Multithreading

GIL

在 CPython 中,由于存在 全局解释器锁,同一时刻只有一个线程可以执行 Python 代码(虽然某些性能导向的库可能会去除此限制)。 如果你想让你的应用更好地利用多核心计算机的计算资源,推荐你使用 multiprocessing 或 concurrent.futures.ProcessPoolExecutor。 但是,如果你想要同时运行多个 I/O 密集型任务,则多线程仍然是一个合适的模型。

Python多线程

threading标准库

可以使用threading标准库的Thread类创建并管理线程,相对而言比较繁琐。

ThreadPoolExecutor

concurrent.futures 标准库提供了ThreadPoolExecutor类型,可以方便创建和使用线程池。

示例

import time
import requests
from functools import partial
from concurrent.futures import ThreadPoolExecutor

def fetch(url:str, session: requests.Session) -> int:
    resp = session.get(url)
    return resp.status_code

with requests.Session() as session:
    start = time.time()
    for x in range(100):
        fetch(f'http://httpbin.org/get?a={x}', session) 
    print(f'For Loop Cost: {time.time()-start} seconds')

# For Loop Cost: 26.713851928710938 seconds

with ThreadPoolExecutor() as pool,requests.Session() as session:
    fetch_with_session = partial(fetch, session = session)
    start = time.time()
    list(pool.map(fetch_with_session, [f'http://httpbin.org/get?a={x}' for x in range(100)]))
    print(f'ThreadPoolExecutor Cost: {time.time()-start} seconds')

# ThreadPoolExecutor Cost: 3.781949758529663 seconds

Backlinks