将线程替换为多进程以提升请求发送速度的技术咨询
用多进程替代线程解决网络请求速度问题
完全可以用multiprocessing替代threading,而且改动极小,完全符合你“不过于复杂”的需求——不用动那100种请求的逻辑,只需要改启动并发的部分。
直接替换线程为进程的修改方案
因为multiprocessing.Process和threading.Thread的API几乎一致,直接替换几行代码就能搞定:
import requests import multiprocessing # 替换threading为multiprocessing def main(a, proxy, proxystr): requests.get() # do some requests.post() # do some2 # etc if __name__ == '__main__': # Windows系统必须加这个保护,Linux/macOS可不加但建议加上 alg = [] odnovrem_t = 10 # 假设你的并发数是10 proxys = "xxx" proxystr = "xxx" for kish in range(odnovrem_t): gf = multiprocessing.Process(target=main, args=(kish, proxys, proxystr,)) gf.start() alg.append(gf) for i in alg: i.join()
更省心的进程池方案
如果不想手动管理进程的启动和等待,用concurrent.futures.ProcessPoolExecutor会更简洁,还能自动控制并发数:
import requests from concurrent.futures import ProcessPoolExecutor def main(a, proxy, proxystr): requests.get() # do some requests.post() # do some2 # etc if __name__ == '__main__': odnovrem_t = 10 proxys = "xxx" proxystr = "xxx" # 创建进程池,最大并发数设为odnovrem_t with ProcessPoolExecutor(max_workers=odnovrem_t) as executor: # 提交任务 futures = [executor.submit(main, kish, proxys, proxystr) for kish in range(odnovrem_t)] # 等待所有任务完成 for future in futures: future.result()
为什么这么改有效?
Python的线程因为GIL(全局解释器锁)的存在,在CPU密集型任务里没法真正并行,但网络请求是IO密集型任务——线程在等待网络响应时会释放GIL,理论上线程也能提升速度,但如果你的请求速度还是慢,可能是线程数不足、同步逻辑拖慢或代理/服务器限制导致的。
而多进程是真正的并行,每个进程有自己独立的Python解释器和GIL,能最大化利用CPU资源处理多个请求的后续逻辑,同时完全兼容你现有的requests代码,不需要改动那100种请求的实现。
注意事项
- Windows系统下必须把启动进程的代码放在
if __name__ == '__main__'块里,否则会触发重复导入和进程启动的问题。 - 并发数不要设置得太大,一般和CPU核心数相当或略多(比如4核CPU设8-10个进程),太多进程会导致系统调度开销增大,反而变慢。
- 如果
main函数里有需要共享的数据,多进程默认是拷贝一份独立使用,若需共享状态,得用multiprocessing提供的队列、管道或共享内存,但如果只是独立请求,完全不需要处理这个。
内容的提问来源于stack exchange,提问作者darumavotado
相关产品推荐
相关产品推荐

