2012-01-28 60 views
1

我在Google App Engine上拥有自己的服务器 我的工作之一是将大量记录与另一个记录匹配。 这需要很长的时间,如果我必须将10000条记录与100匹配。 最佳实现方法是什么?谷歌应用引擎上的任务队列或多线程

我使用Web2py堆栈并在Google App Engine上部署了我的应用程序。

回答

1

也许我误解的东西,但茨艾伦听起来像一个任务队列的完美搭配,我不能看到多线程如何帮助,因为我认为你可以同时为多台回应这只是换货,它赢得如果你的反应时间超过了30秒的限制,那将无济于事。

使用任务可以添加它,然后处理,直到时间限制,然后重新创建另一个任务和剩余的任务,如果您还没有按时间限制完成工作。

+0

它不是一个Web服务请求。它是一个定期执行的cron作业。所以,我的主要工作是将1000个比较分解为更少,并将其作为任务添加到队列中。这有任何意义吗? – Shirish 2012-01-28 17:37:18

1

GAE不支持多线程代码,因此您不能明确使用它。

GAE本身可以是多线程的,这意味着一个前端实例可以同时处理多个http请求。

就你而言,实现并行任务执行的最佳方式是Task Queue。

+0

你的意思是说python27在GAE中不支持多线程? – Chameleon 2012-06-29 08:53:20

+0

从SDK 1.6.4开始,您只能在后端实例上使用后台线程:https://developers.google.com/appengine/docs/python/backends/overview#background_threads – 2012-06-30 07:44:07

1

你正在做的工作的基本结构是让cron工作负责将工作分成更小的单元,并且执行每个单元和任务队列。每个任务的有效载荷将是标识第一组中的实体的信息(例如一组密钥)。每个任务都会执行任何必要的查询,以将第一组中的实体与第二组中的实体进行连接,并存储中间(或可能是最终)结果。您可以调整有效负载大小和任务队列速率,直到执行您的要求。

如果需要汇总每个任务的结果,则可以让每个任务记录其完成情况,并测试所有任务是否完成,或者只是让另一个轮询完成记录的任务启动聚合。当MapReduce功能更为广泛的时候,这将成为执行这类工作的框架。

http://www.youtube.com/watch?v=EIxelKcyCC0 http://code.google.com/p/appengine-mapreduce/

+0

非常感谢。我已经浏览了您提到过的视频,但我有一个问题。 MapReduce Pipeline不能确保处理大量数据。我是否需要真正分解成更小的比较块? – Shirish 2012-01-30 19:43:49

+0

更正,MapReduce实用程序将负责分块和执行。您提供地图和缩小。 :)在上面的回答中,“将工作分成更小的单位”是如果您不使用MapReduce,而是直接使用任务和任意数量的数据实现这一点,您会做什么。通过这种方式思考,您可以调整旋钮来调整性能:每项任务的记录数量。您可以为每个记录创建一个任务,用于10,000个任务,但这可能不是最佳的资源利用方式。 – 2012-01-31 23:25:55