Google app engine 什么';在AppEngine上执行长时间运行的流程的正确方法是什么?

Google app engine 什么';在AppEngine上执行长时间运行的流程的正确方法是什么?,google-app-engine,go,goroutine,Google App Engine,Go,Goroutine,我正在使用Go-on应用程序引擎,我正在尝试构建一个需要执行长时间运行的后台任务的API——在本例中,它需要解析一个大文件并将其分块到任务队列中。我希望它返回一个200并立即关闭用户连接,让进程在后台继续运行,直到完成(这可能需要5-10分钟)。任务队列本身并不真正适用于我的用例,因为解析初始文件可能需要超过API请求的时间限制 起初我试着用围棋来解决这个问题。此操作失败,因为我的应用程序引擎上下文在父函数关闭用户连接后立即过期。(我想我可以尝试编写一个不需要上下文的go例程,但是这样我就失去了

我正在使用Go-on应用程序引擎,我正在尝试构建一个需要执行长时间运行的后台任务的API——在本例中,它需要解析一个大文件并将其分块到任务队列中。我希望它返回一个200并立即关闭用户连接,让进程在后台继续运行,直到完成(这可能需要5-10分钟)。任务队列本身并不真正适用于我的用例,因为解析初始文件可能需要超过API请求的时间限制

起初我试着用围棋来解决这个问题。此操作失败,因为我的应用程序引擎上下文在父函数关闭用户连接后立即过期。(我想我可以尝试编写一个不需要上下文的go例程,但是这样我就失去了日志记录,需要获取整个远程文件并将其传递给go例程。)

从文档中可以看出,appengine以前似乎有一些功能可以支持我想要做的事情:[runtime.RunInBackground],但这些功能现在已经被弃用了,替代品也不明显

现在是否有一种“正确”或推荐的方式来进行后台处理

我想我可以将指向我的大文件的链接放入任务队列,但如果我理解正确,即使是通过任务队列调用的函数也必须在指定的时间内完成执行(是90秒吗?),我需要能够运行更长的时间

感谢您的帮助。

尝试使用: appengine.BackgroundContext()
它应该是长寿命的,但只能在GAE Flex上工作

如果您不能使用taskqueue,那么您可能唯一的选择就是Flex环境。实际上,您可能可以使用gcloud的可恢复上载,然后在完成上载后使用任务队列将其命中另一个端点。如果出现最坏的情况,您可以将flex仅用于无法正常工作的一个端点,然后在标准环境中处理其余端点。当您说“上下文”时,我认为您指的是
context.context
参数。如果是这样:您可能已将请求上下文传递到例程中,因此没有理由不能传递
context.Background()
值。否则,请求上下文将被取消并停止您的例程。如果您在自己的上下文中传递,它可以运行任意时间。Elias-我尝试过,但我需要获取外部数据,这意味着我需要使用urlfetch。当我从context.Background()传递urlfetch一个上下文时,它会出现一个“not a app engine context”错误.PS。我尝试将文件传递给go例程,这样就不需要urlfetch了。但是我在为taskqueue使用context.Background()时遇到了同样的恐慌问题。不知道他们为什么选择恐慌而不是仅仅返回错误。