python - 如何为多处理池中的单个进程分配 python 请求 session ?

标签 python python-3.x session python-requests python-multiprocessing

考虑以下代码示例:

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 中创建进程后它将被复制到每个子进程中。我不确定 session 是否是线程安全的,也不知道 session 中的池是如何工作的,所以 我想为池中的每个进程分配单独的 session 对象 .

我知道,我可以只使用 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 .它们都将父进程和子进程之间的内存对象分开。在我们的例子中,这意味着由 运行的进程的全局命名空间发生了变化。池() 不会传播回父进程,也不会传播回兄弟进程。
对于对象销毁,我们可以依靠垃圾收集器,一旦子进程完成它的工作,它就会介入。 中缺少显式关闭方法multiprocessing.Pool() 使其无法与 GC 不可破坏的对象一起使用(例如 Pool() 本身 - 参见警告 here )
requests docs判断,完全可以使用 requests.Session 没有明确的 close() 就可以了。

关于python - 如何为多处理池中的单个进程分配 python 请求 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52722362/

相关文章:

单击每个链接或重新加载页面时,CodeIgniter-Checking session 变量是否已设置

php - 页面刷新后 session 消失

ios - Ionic iOS session 问题

python - 来自不规则元组的 MultiIndex

python - 反向 Box-Cox 变换

python - 制作字典时尝试保留重复项

python - 如何键入具有封闭类类型的提示方法?

python - 如何在 Windows 中的 python 3 中正确地将焦点传递给消息框或从消息框传递焦点?

python - 删除具有特定值的字典键

python - 使用 pandas read_csv 和 nrows 读取 ~13000 行 CSV 文件的部分内容