sqlalchemy scoped_session и mp.pool с использованием внешних переменных - PullRequest
0 голосов
/ 03 марта 2020

В приведенном ниже примере я пытаюсь добавить много объектов с несколькими потоками, и каждый объект связан с таблицей "someids".

from multiprocessing import Pool
from sqlalchemy.orm import sessionmaker, scoped_session

session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

def user_adder(user):
    session = Session()
    session.add(UserInfo(
        name=user['name'],
        someids_id=session.query(SomeIds).filter_by(some_id = user['some_id']).first()
    ))
    session.commit()

def threading_test(users, n_jobs):
    pool = Pool(n_jobs)
    results = pool.map(user_adder, users_list)

Работает нормально, но мне нужно session.query (SomeIds) для каждого сеанса, который является неоптимальным в случае многих объектов. Более быстрым способом было бы сделать запрос один раз, а затем сделать понимание списка следующим образом:

someids = session.query(SomeIds).all()

, а затем ...

someids_id=[i for i in someids if i.some_id == user['some_id']][0]

Вопрос в том, как передать someids список в функцию пула ( user_adder )?

...