我正在使用 Google App Engine (Python) 实时处理一些事件消息。简而言之,我有 100 多个任务需要在收到消息时快速运行。我尝试了几种方法(延迟库、线程),我认为最好的解决方案是使用任务队列并将这些任务异步添加到队列中我想。这是我正在做的一个例子。
tasks = []
task = Task(url=url_for('main.endpoints_worker'),params={'id': id})
tasks.append(task.add_async(queue_name='event-message'))
for task in tasks:
task.get_result()
当我这样做时,我的大部分时间都花在了将这些任务添加到队列中。有没有办法加快速度?有没有更好的方法?
老实说,每次我运行它时,我得到的时间都大不相同。有时我在 100 毫秒左右(这很好)但其他时候我在 1 秒左右。
我原以为分散工作会更快,但批量添加到任务队列会执行。下面是我所看到的建议方法:
tasks = [Task(url=url_for('main.endpoints_worker'),params={'id': id}) for id in id_list]
rpc = Queue('event-message').add_async(tasks)
rpc.get_result()
更新:由于添加到队列时有 100 个任务限制,我需要再次检查这个问题。 通过批量创建任务(每组 100 个),我大大提高了代码的吞吐量,但我仍然不明白为什么将多组任务添加到队列中速度会如此之快。一个任务 queue.add_async 运行 < 40ms 没有问题。当我执行 2 个或更多 queue.add_async 时,时间会变慢。我很想知道为什么?另外我该如何解决这个问题?
当我在没有异步的情况下添加成批任务时,它们每个都需要 < 40 毫秒。为什么在使用 async 时它们会花费更长的时间?
另一个更新 我认为这个问题可能与争用有关,但即使我将这些任务中的每一个添加到不同的队列中,我也会得到相同的结果。
请您参考如下方法:
您可以通过批量排队任务来节省大量时间。像下面这样的东西应该适合你:
tasks = [Task(url=url_for('main.endpoints_worker'),params={'id': id}) for id in id_list]
rpc = Queue('event-message').add_async(tasks)
rpc.wait()
请注意,您不能使用延迟库批量提交任务。
