Python多进程环境下安全使用requests Session的方式是否正确?
多进程环境下使用requests Session的正确性分析
你的实现思路方向是对的,但代码里存在几个细节问题需要修正,同时针对800+进程的场景可以做进一步优化:
核心逻辑的合理性
多进程模型中,每个进程拥有完全独立的内存空间,全局变量session不会在进程间共享——也就是说每个子进程调用initialize_session()时,都会创建属于自己的Session实例,不会出现不同进程共用同一个Session导致的Cookie串、请求状态互相干扰的问题,这一点完全符合多进程下使用Session的安全要求。
代码中的问题与修正
变量引用错误:
worker函数的参数是args,但函数内部直接使用了j,这会触发NameError(子进程中没有定义j变量),需要先把参数赋值给局部变量:def worker(args): j = args # 修正:将参数转为局部变量j global session initialize_session() # ... 后续代码全局变量的冗余设计:虽然多进程下全局变量不会共享,但用全局变量存储Session不够优雅,也不利于后续维护,推荐直接在
worker内创建Session并使用局部变量存储:def create_session(): session = requests.Session() retry_strategy = Retry( total=3, status_forcelist=[429,500,502,503,504], allowed_methods=["POST"], backoff_factor=1 ) adapter = requests.adapters.HTTPAdapter( max_retries=retry_strategy, pool_connections=1, pool_maxsize=1 ) session.mount("https://", adapter) return session def worker(args): j = args session = create_session() # 用局部变量存储Session,规避全局变量 try: for i in range(10): print(f"I am process {j} and my cookie is ") print(session.cookies.get_dict()) session.cookies.set('worker', str(j)) # Cookie值需为字符串类型 time.sleep(5) # 模拟API调用等业务操作 except Exception as e: print(f"Process {j} error: {e}") raiseCookie类型问题:
session.cookies.set('worker', j)中,j是整数类型,而Cookie值通常要求为字符串,需要转换为str(j),避免潜在的类型兼容问题。
800+进程场景的额外建议
- 连接池配置:当前设置
pool_connections=1和pool_maxsize=1,意味着每个Session仅维持1个连接,800+进程会产生800+并发连接,需要确认目标API的并发限制,避免触发限流或封禁。若API允许更高单进程连接数,可适当调高这两个参数。 - 资源回收:如果进程长期运行,建议任务完成后主动调用
session.close()回收资源,避免不必要的连接占用。 - 进程管理优化:启动800+进程时,不建议循环逐个
start(),可使用multiprocessing.Pool管理进程池,更高效且便于控制并发数。
内容的提问来源于stack exchange,提问作者Welsige
相关产品推荐
相关产品推荐

