【问题标题】:Comparing async urlfetch to urllib2 with threads in google app engine将异步 urlfetch 与 urllib2 与谷歌应用引擎中的线程进行比较
【发布时间】:2023-03-05 19:31:02
【问题描述】:

我必须让suds 异步运行, 我在想两个想法:

  1. (更容易)在单独​​的线程中运行每个 suds 调用,因为 GAE python 2.7 运行时 allows 它。

  2. (更难)重写 suds lib 以在异步 url 获取之上运行

我想使用第一个选项,但不知道它是否会比第二个慢很多。

也许在 GAE 方面更有经验的人可以帮助我选择?

更新

结果必须在单个 Web 请求中,所以我不能使用任务队列/mapreduce/后端

【问题讨论】:

  • 人们还在使用 SOAP??
  • 我喜欢 GAE 版本的 suds,最好使用 ndb 异步。 ;)

标签: python google-app-engine asynchronous urlfetch


【解决方案1】:

根据this question,suds 不是线程安全库。因此,您必须为每个想要使用 suds 客户端对象的线程创建一个新客户端。话虽如此,选择 1 将是您的最佳选择。

另外,请查看here,了解如何使 suds 库与 GAE 上的缓存一起使用。

更新

可以尝试的其他技术(适用于您不需要在单个 Web 请求中获得结果的用例):

BackendsPull Queues:(如果您打算经常拨打电话,请使用此方法)

创建始终在线的后端,将 suds 客户端存储在内存中,并不断轮询拉取队列以查找您需要执行的任务。这样,您可以推送应用程序需要执行的许多任务/调用,并让多个后端以小块的形式消费数据。

Task Queues

(如果您想尝试将成本保持在最低水平并且不打算持续进行多次 SOAP 调用,请使用此方法)

创建任务并让 AppEngine 跨多个实例执行您的需求。只知道无法保证任务何时执行,但根据我的经验,这不是问题。

【讨论】:

  • 但是如果我理解正确的话,两种方式都可以,因为我会为每个异步调用保留单独的客户端实例。但我的问题是,与 (2) 解决方案相比,更简单的解决方案 (1) 是否会有性能下降?
  • 根据我的经验,最大的 CPU 占用是在 suds 中加载我的 WSDL 文件(启用了 memcache)。恕我直言,使用线程与 NDB 的开销可以忽略不计。但是,使用 NDB(上述方法 2)在技术上应该比为每个客户端创建一个新线程(上述方法 1)更快,特别是如果您已经在应用程序中使用 NDB。 IIRC,生产中每个请求只能有 10 个异步 URL 获取调用(我认为是每个请求,可能是每个实例或应用程序)
  • 我准备了一些测试(在此期间我正在克隆 SUDS 客户端实例,因此我只加载 WSDL 文件一次): 1. 进行一次 SUDS 调用 - 需要 4 秒 2. 进行 10 次同步 SUDS 调用- 需要 40 秒 3. 进行 10 次异步 SUDS 调用 - 需要超过 60 秒 (DeadlineExceededError) 我想我遇到了 GIL 问题,因为 SUDS 调用不仅受 I/O 限制,而且也受 CPU 限制(解析 XML 消息并创建 SUDS 结构) .我对吗 ?我能做什么?
  • 你是对的,在 suds 中有很大的 CPU 命中(毕竟是 SOAP),但是如果你使用上面的方法 1,你应该能够在 IO 限制下实现某种速度提升操作(例如 urlfetch 调用)。你可以发布你的代码吗?我会用更多的想法来更新我的答案。还要确保在生产环境中运行测试,而不是在 dev_server 上,因为它会尝试串行运行。尝试使用 appstats 更好地了解您的请求在 URLFetch 调用、CPU 时间和其他 RPC 调用上的等待情况。我知道 suds 会产生大量垃圾日志,禁用它会有所帮助。
  • 我在上面描述的测试中使用了这个代码gist.github.com/krotkiewicz/f741b05265ccc1927123
猜你喜欢
  • 2013-04-22
  • 2014-10-14
  • 2011-08-03
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2011-09-18
  • 2013-05-17
  • 2015-08-03
相关资源
最近更新 更多