代码之家  ›  专栏  ›  技术社区  ›  shane

Python asyncio-我可以从函数中调用协同程序吗?

  •  0
  • shane  · 技术社区  · 7 年前

    class Calculator:
        def __init__(self):
            self._internal = 0
            self._observers = [
    
        def register(observer):
            self._observers.append(observer)
    
        def add(int val):
            for i in range(val):
                self._internal += 1
    
        def _call_observers(self):
            for o in self._observers:
                o.on_add()
    
        @property
        def value(self):
            return self._internal
    

    我需要从一个couproutine调用其他协同程序。我的一个想法是把 AsyncCalculator

    (非真实代码)

    class AsyncCalculator(Calculator):
        def __init__(self, loop):
            ...
    
        async def _call_observers(self):
            ...
    

    我想知道,如果有对事件循环或任何其他可用结构的引用,是否有一种方法可以等待来自普通函数的协程?似乎,如果函数是从一个协程调用的,那么可能有一些黑客的方法来等待来自函数的另一个协程。那么也许黑客可以被扔到一个实用程序里?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user4815162342    7 年前

    如果 Calculator _call_observers async,可以执行以下操作:

    class _Observer:
        def __init__(self, fut):
            self.fut = fut
        def on_add(self):
            self.fut.set_result('add')
    
    async def my_coro(calc):
        loop = asyncio.get_event_loop()
        fut = loop.create_future()
        calc.register(_Observer(fut))
        # wait for the observer to be invoked
        op = await fut
        if op == 'add':
            ...