Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最大并行后台线程数(后端)_Java_Google App Engine - Fatal编程技术网

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

Java 最大并行后台线程数(后端),java,google-app-engine,Java,Google App Engine,一个谷歌应用引擎后端可以启动多少并行后台线程?我没有找到任何关于允许并行线程数量的信息。我正在使用Java进行GAE 我启动了一个新线程,如文档[1]中所述 return ThreadManager.createBackgroundThread(new Runnable() { ... }); 如果我运行应用程序,一段时间后(在创建新线程时)会引发以下异常: 此[2]问题提到,如果API超出配额,则会出现此异常。因此,我可以创建线程,但在一段时间后,会出现异常。这就是为什么我认为后端中的线程是

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

我启动了一个新线程,如文档[1]中所述

return ThreadManager.createBackgroundThread(new Runnable() { ... });
如果我运行应用程序,一段时间后(在创建新线程时)会引发以下异常:

此[2]问题提到,如果API超出配额,则会出现此异常。因此,我可以创建线程,但在一段时间后,会出现异常。这就是为什么我认为后端中的线程是有限的

[1]


[2]

如果有例外,我假设您使用的是Java

你是如何创建线程的?您应该使用ThreadManager(而不是调用“new Thread()”,后者不受支持)

后台线程是指后台的代码吗?您需要在后端任务中启动后台线程

对于记录,每个请求限制为50个线程


阅读线程。

我的问题是后端的API限制。我可以启动任意多个线程,但当我达到API限制(100次同时调用)时,就无法创建新线程。配额和限制如中所述


我减少了API调用(数据库、google云存储)以提高应用程序的性能,异常情况消失了:)。

记录在案,App Engine区分为,不能超过启动它们的HTTP请求,和,可以

对于Python,至少生产(Python 2.7)运行时和dev_appserver都对每个后端设置了10个后台线程的固定限制,这与 其他设置,例如中的
max\u concurrent\u requests

我已经和其他一些老的应用引擎团队成员谈过了,虽然他们不是 100%肯定,他们说这听起来是对的。我已经用经验证实了这一点 测试后端配置和下面的代码。我还尝试从一个单独的HTTP请求和另一个后台线程启动更多的后台线程。没有运气;相同的总限制为10

以下是SDK在dev_appserver(特别是SDK 1.8.8中的devappserver2)中为Python设置的限制: , . 看起来Go和Java的后台线程都被禁用了: ,

一个有趣的怪癖:在后台线程中,看起来您可以启动任意多个正常线程,至少在达到内存限制之前是这样。它们不会打开任何HTTP请求,而且它们似乎也不会在截止日期前被切断。我现在这样做是为了绕过后台线程限制

我希望这是有记录的!会节省我很多时间


后端。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)

你什么时候开始看到这个问题?例如,在创建一定数量的线程时是否会发生这种情况?默认后端实例类型仅适用于。根据每个线程的内存占用情况,也可能会耗尽内存。在PythonGAE应用程序中,你实际上可以。我编辑了我的问题。是的,我可以在后端创建线程,没有问题。我使用的B4后端有512M的内存,所以我不认为我的内存不足。但是你是对的,当我创建了一定数量的线程(但我不知道有多少线程)时就会发生这种情况。你能重现这个问题来确定在这种情况下有多少线程正在运行吗?我不能说允许多少线程,但我知道GAE有一个线程限制。我使用任务队列调用后端并执行一些工作。一段时间后,一些任务失败,但后端没有抛出错误。所以我认为如果达到线程限制,您就不能创建新的后台进程,也不能在后端启动新任务。因此,我不能说允许多少线程:(。我将创建一个答案,并说明我或多或少是如何绕过这个问题的。
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)