在一个谷歌应用程序引擎后端可以启动多少个并行后台线程?我没有找到任何关于允许并行线程数量的信息。我在GAE中使用Java。
我开始了一个新的线程,如文档中所解释的:[1]
return ThreadManager.createBackgroundThread(new Runnable() { ... });
如果我运行我的应用程序,一段时间后会抛出以下异常(在创建新线程时):
com.google.appengine.api.system.SystemFailureException: An unknown error occurred
此[2]问题提到,如果API超出配额,则会出现此异常。所以我可以创建线程,但过了一段时间就会出现异常。这就是为什么我认为后端有线程的限制。
[1]https://developers.google.com/appengine/docs/java/backends/overview#background_threads
[2]http://code.google.com/p/googleappengine/issues/detail?id=7398
记录在案,应用程序引擎区分了正常线程和后台线程,前者的寿命不能超过启动它们的HTTP请求,后者可以。
对于Python,至少看起来生产(Python 2.7)运行时和dev_appserver都对每个后端10个后台线程施加了固定限制其他设置,例如中的max_concurrent_requests
backends.yaml.
我和其他一些老的应用引擎团队成员谈过,虽然他们没有100%肯定,他们说这听起来是对的。我已经从经验上证实了测试下面的后端配置和代码。我还尝试从一个单独的HTTP请求和另一个后台线程启动更多的后台线程。运气不佳;总限额为10。
以下是SDK在dev_appserver(特别是SDK 1.8.8中的devappserver2)中为Python设置的限制:例如py:449,python_runtime。py:61。看起来Go和Java的后台线程被完全禁用了:go_runtime.py:99,java_runtime.py:61.
一个有趣的怪癖是:在后台线程中,看起来你可以启动任意多个普通线程,至少在达到内存限制之前。他们不会打开任何HTTP请求,而且似乎也不会在截止日期前被切断。我目前这样做是为了绕过后台线程限制。
我希望这能被记录下来!会为我节省很多时间。
后端。yaml
- name: test
instances: 1
start: threadtest.application
测试.py
def test():
for i in range(100):
logging.info('Starting #%d', i)
background_thread.start_new_background_thread(time.sleep, [20])
class Start(webapp2.RequestHandler):
def get(self):
background_thread.start_new_background_thread(test, [])
application = webapp2.WSGIApplication([('/_ah/start', Start)], debug=True)
我的问题是后端的API限制。我可以启动任意数量的线程,但当我达到API限制(100个同时调用)时,创建新线程是不可能的。配额和限额在其文档中进行了说明。
我减少了API调用(数据库、谷歌云存储),以提高应用程序的性能,异常消失了:)。
如果出现异常,我假设您使用的是Java。
你是如何创建线程的?您应该使用ThreadManager(而不是调用不支持的"new Thread()")。
后台线程是指后台的代码吗?您需要在后端任务中启动后台线程。
对于记录,每个请求被限制为50个线程。
在这里阅读线程。