【问题标题】:How does appengine NDB Asynchronous Operation eventloop work?应用引擎 NDB 异步操作事件循环如何工作?
【发布时间】:2017-02-15 13:08:33
【问题描述】:

我在 App Engine 标准环境上使用 python 运行时。

我在我的代码中使用了一些异步操作,引自教程:

  • 您也许可以通过执行 数据存储操作与其他操作并行,或执行一些操作 数据存储操作彼此并行。

  • Tasklet 是一种无需线程即可编写并发函数的方法; tasklet 由事件循环执行

https://cloud.google.com/appengine/docs/python/ndb/async

这都是关于并行执行的,但我不明白这种并行性在同步 python 代码中是如何工作的。

事件循环是如何工作的?它是否在单独的进程/线程中运行? 它是否执行任何真正并发的执行?或者它只是创建批处理 RPC 的便捷方式,它们在第一次 get_result() 调用时同步运行?

https://cloud.google.com/appengine/docs/python/refdocs/modules/google/appengine/ext/ndb/eventloop

【问题讨论】:

    标签: python multithreading google-app-engine asynchronous app-engine-ndb


    【解决方案1】:

    正如您所怀疑的那样,异步操作只是在阻塞第一个(以及所有后续)get_result() 调用之前创建和启动多个 RPC(可能是批处理也可能不是批处理,这不是强制性的)的一种方式。这适用于大多数/所有基于 RPC 的 GAE 基础架构(ndb、memcache、urlfetch 等)

    如果您查看大多数调用(支持异步版本)的非异步版本的实现,您会发现它们实际上只是紧跟在 get_result() 调用之后的异步版本调用,例如:

      @classmethod
      def _get_or_insert(*args, **kwds):
        """Transactionally retrieves an existing entity or creates a new one.    
        (snip)          
        """
        cls, args = args[0], args[1:]
        return cls._get_or_insert_async(*args, **kwds).get_result()
      get_or_insert = _get_or_insert
    

    至于运行事件循环本身 - 当您的应用通过 get_event_loop() 进行第一次 ndb RPC 调用(请求/线程)时,它看起来是透明地启动的:

    def get_event_loop():
      """Return a EventLoop instance.
    
      A new instance is created for each new HTTP request.  We determine
      that we're in a new request by inspecting os.environ, which is reset
      at the start of each request.  Also, each thread gets its own loop.
      """
      ev = _state.event_loop
      if not os.getenv(_EVENT_LOOP_KEY) and ev is not None:
        ev.clear()
        _state.event_loop = None
        ev = None
      if ev is None:
        ev = EventLoop()
        _state.event_loop = ev
        os.environ[_EVENT_LOOP_KEY] = '1'
      return ev
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多