Объект локальный для потока в multiprocessing.dummy.Pool - PullRequest
0 голосов
/ 04 октября 2018

Я использую 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 голосов
/ 05 октября 2018

Использование 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
...