代码之家  ›  专栏  ›  技术社区  ›  Sharvari Gc

在asyncio中运行类方法列表

  •  0
  • Sharvari Gc  · 技术社区  · 6 年前

    我试图使用asyncio来运行一个类的所有方法。下面是一个简单的代码:

    Class Reports:
       def __init__(self, name):
          self.name = name
       async def func1(**kwargs):
            await subfunc1
       async def func2(**kwargs):
            await subfunc2
    
    report = Reports('dealer1)
    func_list = ['func1', 'func2']
    keyworded_args = {'arg1':arg1, 'arg2' : arg2}
    futures = [exec('reports' + func(**keyworded_args)) for func in func_list]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(futures)
    

    这将在执行列表期间运行exec语句中的函数。 还有什么选择?有20多个功能,而且列表还在不断增加。因此,我们需要一种紧凑的方式来使用asyncio运行类的所有方法。

    我使用python 3.6.8

    0 回复  |  直到 6 年前
        1
  •  0
  •   Amiram    6 年前

    有几种方法可以 extract all the object public functions ,我选择了 dir 内置功能。

    一旦你拥有了所有的功能,你就可以使用 inspect.iscoroutinefunction 为了知道函数是否为 coroutine 作用

    请考虑以下几点 class Reports 例子:

    class Reports:
       def __init__(self, name):
          self.name = name
    
       async def __class_private(self):
           print('__class_private')
    
       async def _private(self):
           print('_private')
    
       async def func1(self, *args, **kwargs):
            print('func 1')
    
       async def func2(self, *args, **kwargs):
           print('func 2')
    
       def func3(self, *args, **kwargs):
           print('func 3')
    

    下面的代码将提取所有 async 平民的 课程的功能。

        report = Reports('dealer1')
        func_list  = [getattr(report, func) for func in dir(report) if callable(getattr(report, func)) and not func.startswith('_')]
    

    它一次处理所有类函数并排除所有私有函数。

    现在是第二部分,运行所有这些(你可以使用列表理解来完成,我想展示流程和输出):

        for f in func_list:
            if inspect.iscoroutinefunction(f):
                print(f.__name__)
                tasks.append(loop.create_task(f()))
        print('Results')
        done, pending = await asyncio.wait(tasks)
        print(done)
        print(pending)
    

    运行它将产生以下结果:

    func1
    func2
    Results
    func 1
    func 2
    {<Task finished coro=<Reports.func2() done, defined at C:/stackoverflow/tests:18> result=None>, <Task finished coro=<Reports.func1() done, defined at C:/stackoverflow/tests:15> result=None>}
    set()
    

    附笔

    它将运行 全部的 班级 平民的 功能。