包含contains_eager的sqlalchemy模型实例作为arg提交给ThreadPoolExecutor

时间:2018-08-03 10:08:02

标签: python flask sqlalchemy python-multithreading

我有以下两种模型

class User(db.Model, CreatedAtMixin, ModifiedAtMixin):
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True)

class Balance(db.Model, ModifiedAtMixin):
     __tablename__ = "billing_balance"

     id = db.Column(db.Integer, primary_key=True)

     user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
     user = db.relationship("User", backref=backref("balance", uselist=False))

我需要选择一些带有User负载的天平(以最大程度地减少数据库查询的数量),并以非阻塞方式异步处理每个天平。

这是我的做法:

def pmap(fn, iterable, max_workers=20):

    def _ensure_arg_is_iterable(arg):

        if type(arg) in (list, tuple):
            return arg

        return (arg,)

    futures = []
    pool = ThreadPoolExecutor(max_workers=max_workers)
    for params in iterable:
        futures.append(pool.submit(fn, *_ensure_arg_is_iterable(params)))
    return futures


def some_func(balance):
    print(balance.user)


def main():
    balances = db.session.query(Balance).outerjoin(
        User, Balance.user_id == User.id
    ).filter(
         # conditions
    ).options(
       contains_eager(Balance.user)
    )

    ready_to_process = []
    for balance in balances:
        some_irrelevant_method(balance)
        # print(balance.user)
        ready_to_process.append(balance)

    pmap(some_func, ready_to_process)

问题是,如打印语句所示,balance.userNone中是some_func(balance),除非我在balance.user中显式调用main()。因此,在没有得到AttributeError的情况下,我无法调用任何方法或在balance.user中获得some_func的任何属性。

任何有关如何解决此问题的建议或有关如何解决该问题的建议都将受到赞赏。

0 个答案:

没有答案