繁体   English   中英

执行程序 Map 不运行 function

[英]Executor Map doesn't run a function

我正在尝试重现比赛条件。 下面的代码适用于提交而不是 map 但我想了解为什么 map 不运行更新方法。

import concurrent.futures
import time


class BankAccount:
    def __init__(self):
        self.balance = 100  # shared data

    def update(self, transaction, amount):
        print(f'{transaction} started')
        tmp_amount = self.balance  # reading from db
        tmp_amount += amount
        time.sleep(1)
        self.balance = tmp_amount
        print(f'{transaction} ended')


if __name__ == '__main__':
    acc = BankAccount()
    print(f'Main started. acc.Balance={acc.balance}')

    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as ex:
        ex.map(acc.update, [dict(transaction='refill', amount=100),
                            dict(transaction='withdraw', amount=-200)])

    print(f'End of Main. Balance={acc.balance}')

在单独的迭代中传递每种参数。

ex.map(acc.update, ['refill', 'withdraw'], [100, -200])

map一样, Executor.map每个参数采用一个可迭代对象,并将每个可迭代对象分配给一个参数。 此外,在实际访问结果之前不会传播错误。

Executor.map(func, *iterables, timeout=None, chunksize=1)

类似于map(func, *iterables) ...

如果func调用引发异常,则在从迭代器中检索其值时将引发该异常。

因此,代码错误地通过了 arguments,但抑制了错误。 获取值,例如通过list(ex.map(...))显示错误:

TypeError: update() missing 1 required positional argument: 'amount'

为每种类型的参数创建一个单独的迭代可以防止这种情况。

#                  V transaction
ex.map(acc.update, ['refill', 'withdraw'], [100, -200])
#                                          ^ amount

可能需要通过电话而不是实物订购 arguments。 使用zip*解包来转换map所需的输入。

ex.map(acc.update, *zip(('refill', 100), ('withdraw', 200)))

如果需要关键字 arguments,则需要一个帮助程序来解压缩 arguments。

def kwargify(func):
    """Wrap ``func`` to accept a dictionary of keyword arguments"""
    return lambda kwargs: func(**kwargs)

将所需的 function 传递给ex.map

    ex.map(
        kwargify(acc.update),
        [
            dict(transaction='refill', amount=100),
            dict(transaction='withdraw', amount=-200)
        ]
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM