最大。并行背景线程数(后端)

时间:2012-12-18 15:47:04

标签: java google-app-engine

我可以在一个谷歌应用引擎后端启动多少个并行后台线程?我没有找到任何并行允许线程的信息。我正在使用Java作为GAE。

我按照文档中的说明开始了一个新主题:[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

2 个答案:

答案 0 :(得分:6)

对于记录,App Engine区分normal threadsbackground threadsbackends.yaml不能超过启动它们的HTTP请求。

对于Python ,至少看起来生产(Python 2.7)运行时和dev_appserver都强加了每个后端10个后台线程的固定限制,独立于 其他设置,例如max_concurrent_requests in instance.py:449

我和其他几位老App Engine团队成员谈过,但事实并非如此 100%肯定,他们说这听起来是正确的。我已经通过经验确认了 测试后端配置和代码如下。我还尝试从单独的HTTP请求和另一个后台线程启动更多后台线程。没运气;相同的总限额为10总。

这是SDK在Python中为dev_appserver(特别是SDK 1.8.8中的devappserver2)设置限制的地方: python_runtime.py:61go_runtime.py:99。 看起来Go和Java完全禁用了后台线程: java_runtime.py:61, {{3}}

一个有趣的怪癖:在后台线程中,看起来你可以根据需要启动任意数量的普通线程,至少在你达到内存限制之前。他们没有打开任何HTTP请求,他们似乎也没有在截止日期前被截断。我目前正在这样做以解决后台线程限制。

我希望这是有记录的!本来可以节省我很多时间。


<强> backends.yaml

- name: test
  instances: 1
  start: threadtest.application

<强> test.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)

答案 1 :(得分:2)

我的问题是后端的API限制。我可以根据需要启动尽可能多的线程,但是当我达到API限制(100次同时调用)时,无法创建新线程。配额和限制在their docs中描述。

我减少了我的API调用(数据库,谷歌云存储),以加快应用程序的性能,异常消失了:)。