How to assign python requests sessions for single processes in multiprocessing pool?(如何为多进程池中的单进程分配PYTHON请求会话?)
本文介绍了如何为多进程池中的单进程分配PYTHON请求会话?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑以下代码示例:
import multiprocessing
import requests
session = requests.Session()
data_to_be_processed = [...]
def process(arg):
# do stuff with arg and get url
response = session.get(url)
# process response and generate data...
return data
with multiprocessing.Pool() as pool:
results = pool.map(process, data_to_be_processed)
在示例中,Session被赋值为全局变量,因此在Pool中创建进程后,它将被复制到每个子进程中。我不确定会话是否是线程安全的,也不确定会话池的工作原理,因此我想为池中的每个进程分配单独的会话对象。
我知道我可以只使用requests.get(url)而不是session.get(url),但我想使用Session,我也在考虑使用requests-html(https://html.python-requests.org/)。
我不太熟悉Python的多处理,到目前为止我只使用了池,因为它是我认为最好的并行处理数据的解决方案,没有临界区,所以我对不同的解决方案持开放态度。
有没有办法干净利落地做这件事?
推荐答案
简答:您可以使用全局命名空间在初始值设定项和函数之间共享数据:
import multiprocessing
import requests
session = None
data_to_be_processed = [...]
def init_process():
global session
session = requests.Session()
def process(arg):
global session
# do stuff with arg and get url
response = session.get(url)
# process response and generate data...
return data
with multiprocessing.Pool(initializer=init_process) as pool:
results = pool.map(process, data_to_be_processed)
答案很长:
Python使用三种可能的start methods之一。它们都将父进程和子进程之间的内存对象分开。在我们的示例中,这意味着Pool()运行的进程的全局命名空间中的更改不会传播回父进程,也不会传播回同级进程。
对于对象销毁,我们可以依赖垃圾收集器,它在子进程完成其工作后介入。多进程.Pool()中缺少显式关闭方法,因此无法用于GC无法销毁的对象(如Pool()本身-请参阅警告here) 从requests docs判断,使用请求而不显式关闭()是完全可以的。
这篇关于如何为多进程池中的单进程分配PYTHON请求会话?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:如何为多进程池中的单进程分配PYTHON请求会话?
基础教程推荐
猜你喜欢
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
