【问题标题】:Passing args, kwargs, to run_in_executor将 args、kwargs 传递给 run_in_executor
【发布时间】:2018-11-19 04:12:39
【问题描述】:

我正在尝试将参数传递给run_in_executor,如下所示:

    loop.run_in_executor(None, update_contacts, data={
        'email': email,
        'access_token': g.tokens['access_token']
    })

但是,我收到以下错误:

run_in_executor() 得到了一个意外的关键字参数“数据”

有没有一种通用的方法可以将 args 传递给这个函数?

【问题讨论】:

  • update_contacts的定义是什么?

标签: python python-asyncio


【解决方案1】:

使用functools.partial;这是执行此类操作的标准方法,在 the docs 中特别推荐用于 loop.run_in_executor,以及更普遍地在 the Event Loop docs 中推荐。

这可能是你的样子:

import functools  # at the top with the other imports

loop.run_in_executor(None, functools.partial(update_contacts, data={
    'email': email,
    'access_token': g.tokens['access_token']
}))

如果你愿意,你也可以from functools import partial

【讨论】:

    【解决方案2】:

    您要求“通用方式”;最通用的答案是您为此目的创建了一个函数。如果您要提供的 data 对于调用者来说是本地的,那么您可以在调用者内部创建该函数,也许是一个 lambda:

    loop.run_in_executor(None,lambda: update_contacts(data={
      'email': email,
      'access_token': g.tokens['access_token']
    })
    

    正如给定的那样,这与functools.partial 答案没有太大区别,并且(如文档所述)它可能会降低调试输出的实用性,但它可以让您执行计算data 执行程序上的值之类的事情并对来自update_contacts 的返回值进行操作。

    【讨论】:

      【解决方案3】:

      创建一个调用它的函数:

      def foo():
          update_contacts(data={'email': email,'access_token': g.tokens['access_token']})
      loop.run_in_executor(None, foo)
      

      ,func也可以是lambda:

      loop.run_in_executor(None, lambda: update_contacts(data={'email': email,'access_token': g.tokens['access_token']})
      

      或使用 fuctools

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2013-07-26
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2020-06-30
        相关资源
        最近更新 更多