使用 Google App Engine 的 NDB 创建异步方法

2023-12-06

我想确保我了解如何创建微线程和异步方法。我拥有的是一个返回列表的方法。我希望从某个地方调用它,并立即允许进行其他调用。所以我有这个:

future_1 = get_updates_for_user(userKey, aDate)
future_2 = get_updates_for_user(anotherUserKey, aDate)
somelist.extend(future_1)
somelist.extend(future_2)

....    

@ndb.tasklet
def get_updates_for_user(userKey, lastSyncDate):
    noteQuery = ndb.GqlQuery('SELECT * FROM Comments WHERE ANCESTOR IS :1 AND modifiedDate > :2', userKey, lastSyncDate)
    note_list = list()
    qit = noteQuery.iter()
    while (yield qit.has_next_async()):
        note = qit.next()
        noteDic = note.to_dict()
        note_list.append(noteDic)
    raise ndb.Return(note_list)

这段代码是否符合我的预期?也就是说,这两个调用会异步运行吗?我正确使用期货吗?

Edit:经过测试,代码确实产生了预期的结果。我是 Python 新手 - 有哪些方法可以测试方法是否异步运行?


自己验证这些方法是否同时运行是非常困难的——您必须进行大量的日志记录。而且在开发应用程序服务器中,这会更加困难,因为它并没有真正并行运行 RPC。

你的代码看起来不错,它使用yield在正确的地方。

我唯一的建议是命名你的函数get_updates_for_user_async()-- 这与 NDB 本身使用的约定相匹配,并向代码读者提示该函数返回一个 Future 并且应该产生它以获得实际结果。

另一种方法是使用map_async()方法上的Query目的;它会让你写一个回调,其中只包含to_dict() call:

@ndb.tasklet
def get_updates_for_user_async(userKey, lastSyncDate):
  noteQuery = ndb.gql('...')
  note_list = yield noteQuery.map_async(lambda note: note.to_dict())
  raise ndb.Return(note_list)

高级提示:您可以通过删除@ndb.tasklet装饰器并返回 Future 返回的map_async():

def get_updates_for_user_Async(userKey, lastSyncDate):
  noteQuery = ndb.gql('...')
  return noteQuery.map_async(lambda note: note.to_dict())

这是对仅包含一个生成并立即返回生成的值的异步函数的一般轻微优化。 (如果你没有立即明白这一点,那么你就处于良好的伙伴关系中,并且它存在被未来的维护者破坏的风险,而他也没有这样做。:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Google App Engine 的 NDB 创建异步方法 的相关文章

  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • PySpark groupByKey 返回 pyspark.resultiterable.ResultIterable

    我试图找出为什么我的 groupByKey 返回以下内容 0
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 如何使用 Boto3 启动具有 IAM 角色的 EC2 实例?

    我无法弄清楚如何使用指定的 IAM 角色在 Boto3 中启动 EC2 实例 以下是迄今为止我如何成功创建实例的一些示例代码 import boto3 ec2 boto3 resource ec2 region name us west 2
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

    Django Rest 框架有一个主键相关字段 http www django rest framework org api guide relations primarykeyrelatedfield其中列出了我的 IDmany to m

随机推荐

  • 将 Playframework 与 Java 结合使用时的父/子表单

    我有一个 问题 实体 它有一个 答案 其中有一个 替代方案 列表 如下所示 public class Question extends BaseEntity private String text private String source
  • 负向前瞻正则表达式

    我想匹配所有以 htm 结尾的字符串 除非它以 foo htm 结尾 我通常对正则表达式很熟悉 但负面的前瞻让我感到困惑 为什么这不起作用 foo htm i test foo htm returns true I want false 我
  • 将“exec()”与 NDK 一起使用

    我记得在某处读过 建议不要在 NDK 编译的 C 代码中使用 exec 推荐的方法是什么 我们是否尝试将 EXEC 代码推送到 Java 空间 也就是说 JNI 或应用程序 生成新进程 以及相关的将结果传递回 NDK 首先 不建议使用for
  • 是否可以在不使用 KeyContainerName 的情况下签署 xml 文档?

    我想创建 2 个非常简单的 dll 1 将签署一个xml文档 2 这将检查xml文档是否未被修改 我尝试使用 RSACryptoServiceProvider 和密钥容器 但是当我移动到另一台机器时 这不起作用 因为密钥存储在机器中 我想将
  • 如何在android服务类中获取上下文

    当我尝试从内存读取 XML 文件并将其写入对象时 出现以下错误 似乎获取上下文有问题 谁能告诉我我的代码有什么问题吗 Code public class WifiScanning extends Service private static
  • 使用 perl 的列宽自动调整功能

    我已经使用 perl 脚本使用一组 csv 文件生成了 Excel 工作表 我需要将列的宽度设置为auto fit 我应该做什么 我有在名为 OLE 的模块中执行此操作的方法 我不知道如何执行此操作 请帮助我 无法将文件的列设置为 自动调整
  • 为什么 JMenu 不总是在最上面?

    JMenu 表现正常 直到使用 JButton 更新 JFrame 上的 JTable 然后 JMenu 大部分被 JPanel 隐藏 见下图 当 JMenu 被选中时 它不应该总是在最上面吗 怎么就被推到后面了呢 更新 jButtonAd
  • Python 中的二分查找(二分查找)

    是否有一个库函数可以对列表 元组执行二分搜索 如果找到则返回该项目的位置 如果没有则返回 False 1 None 等 我在中找到了函数 bisect left right对分模块 但即使该项目不在列表中 它们仍然返回一个位置 这对于他们的
  • 匹配具有命名空间属性的 XML 元素时出现问题

    如果我要使用 xslt 将一段文本插入下面的 xml 中 条件语句会是什么样子
  • Java 泛型 - 无界通配符到底是什么?

    如果我有以下代码 public static void main String args List
  • 将辅助 X 轴标签添加到带有一个 X 轴的 ggplot

    编辑 这里有两个很好的解决方案 一个被标记为答案 但是 hrbrmstr提供了一个很好的解决方案 结合了两个ggplots 它非常适合这个简单的图 这是代码 breaks major lt c 0 15 37 5 52 5 67 5 82
  • Log4J 不在日志文件条目之间添加换行符

    我刚刚开始使用 log4j 我在读取属性文件和实际记录事件时没有问题 但它似乎将所有内容都附加到同一行的末尾 我的属性文件如下所示 A1 is set to be a ConsoleAppender log4j appender A1 or
  • Silverstripe 3.1.5 - 上传错误 SyntaxError:意外的标记 <

    我需要上传 svg 文件 为此 我将 svg 添加到我的 config yml 上传字段允许的扩展名以及 asset 中的 htacces 另外 我的所有资产目录都有 CHMOD 777 文件已上传但未附加 相反 我在上传字段中收到此错误语
  • 使用CSS调整图像大小

    我正在尝试仅使用 css 调整图像大小 它正在调整大小 但由于某种原因它没有拉伸到浏览器的 100 我想要的是它将调整给定高度的图像大小 但宽度在整个浏览器中应该为 100 我创建了一个小提琴作为演示 以便您可以看到发生了什么 div cl
  • BASH:错误消息未重定向到文件

    我有一个 bash 脚本 它只是调用不同的调用并将 stdout 和 stderr 输出重定向到不同的文件 我已经这样做了 command 1 gt datafile 2 gt gt errorfile 但是 当命令错误时 例如 作为参数给
  • 检查字符串列表 A 中的任何项目是否是字符串列表 B 中项目的子字符串

    我正在尝试对一组匹配器和一组字符串进行排序 这样如果我有 matchers foo bar abc and strings afooa zbarz abcabc purple foobar 我希望能够获得以下任何元素strings其中任意元
  • 如何在 Access 2010 中使用 .mdw 文件

    在 Access 2010 中 如何打开需要使用 mdw 文件的数据库 在 Access 2003 中创建 在 Access 2003 中 您必须首先引用 mdw 文件 我不知道如何在 Access 2010 中执行此操作 有人可以告诉我如
  • 获取ActiveMQ中的队列名称列表

    我尝试过下面的代码来获取 ActiveMQ 中的队列列表 但它不起作用 我的 ActiveMQ 有 4 个队列 try ActiveMQConnection makeConnection URL start Set
  • WaitForElementClickable/可见 - Selenium C#

    我需要实现并修改我当前的方法来完成这两件事 等待元素可见 当前已实现 但仍使用预期状况这是过时的并且might be改变 等待可点击的元素 当我的测试运行时 它面临 加载圆圈 的问题 我按下按钮 在加载窗口之前 有一个加载程序 需要 1 到
  • 使用 Google App Engine 的 NDB 创建异步方法

    我想确保我了解如何创建微线程和异步方法 我拥有的是一个返回列表的方法 我希望从某个地方调用它 并立即允许进行其他调用 所以我有这个 future 1 get updates for user userKey aDate future 2 g