You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用multiprocessing.Pool.map时能否安全复用requests.Session?

多进程下复用requests.Session的问题解析

结论先行:不能在多进程中复用同一个requests.Session对象,你贴的代码也不具备并发安全性

为什么不能复用?

  • 多进程的内存是完全隔离的:当你用multiprocessing.Pool创建子进程时,每个子进程会复制父进程的内存数据,包括那个Session对象。但复制之后,子进程里的Session和父进程的已经是完全独立的两个实例了——根本达不到“复用”的目的,每个进程都有自己的Session副本,共享Cookie、连接池这些需求根本实现不了,反而浪费内存。
  • requests.Session本身不是线程/进程安全的:Session内部维护了CookieJar、HTTP连接池这些状态数据,这些数据的操作没有做并发保护。哪怕是在多线程环境下,多个线程同时操作同一个Session,都可能导致Cookie被覆盖、连接池混乱,出现请求失败或数据错误的情况,更别说多进程了。

你的代码问题在哪?

你写的代码里,父进程创建了一个Session,然后子进程各自复制了这个Session。但这些Session副本是独立的,既没实现复用,还可能因为Session本身的非安全设计,在后续扩展(比如一个进程处理多个请求)时出现问题。而且这种写法完全误解了多进程的内存模型,以为能共享对象,实际上做不到。

正确的做法

每个进程单独创建自己的Session对象,这样既能保证每个进程内复用连接池,又能避免状态混乱:

from multiprocessing import Pool
import requests

def download(url):
    # 每个进程内部创建独立的Session
    with requests.Session() as s:
        return s.get(url).text

urls = ["https://example.com"] * 10

with Pool(5) as p:
    p.map(download, urls)

如果需要在多个进程间共享某些状态(比如登录后的Cookie),可以在父进程中把这些状态序列化后传递给子进程,子进程在自己的Session里初始化这些状态,而不是直接共享Session对象。

内容的提问来源于stack exchange,提问作者falsePockets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:43:19