multiprocessing.dummy.Pool

时间:2018-10-04 17:30:05

标签: python python-requests python-multiprocessing

我正在使用multiprocessing.dummy.Pool并行发出RESTful API调用。

目前,代码如下:

from multiprocessing.dummy import Pool
def onecall(args):
    env = args[0]
    option = args[1]
    return env.call(option) # call() returns a list

def call_all():
    threadpool = Pool(processes=4)
    all_item = []
    for item in threadpool.imap_unordered(onecall, ((create_env(), x) for x in range(100))):
        all_item.extend(item)
    return all_item

在上面的代码中,env对象包装了requests.Session()对象,因此负责维护连接会话。这100个任务使用100个不同的env对象。因此,每个任务仅创建1个连接,进行1个API调用并断开连接。

但是,为了享受HTTP保持活动的好处,我希望100个任务共享4个env对象(每个线程一个对象),以便每个连接一个接一个地服务多个API调用。我应该如何实现?

1 个答案:

答案 0 :(得分:0)

使用threading.local似乎可行。

from multiprocessing.dummy import Pool
import threading

tlocal = threading.local()
def getEnv():
    try:
        return tlocal.env
    except AttributeError:
        tlocal.env = create_env()
    return tlocal.env

def onecall(args):
    option = args[0]
    return getEnv().call(option) # call() returns a list

def call_all():
    threadpool = Pool(processes=4)
    all_item = []
    for item in threadpool.imap_unordered(onecall, ((x,) for x in range(100))):
        all_item.extend(item)
    return all_item