最大并行后台线程数(后端)



在一个谷歌应用程序引擎后端可以启动多少个并行后台线程?我没有找到任何关于允许并行线程数量的信息。我在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_requestsbackends.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个线程。

在这里阅读线程。

最新更新