我正在使用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调用。我应该如何实现?
答案 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