当前位置: 首页 > 知识库问答 >
问题:

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

平元明
2023-03-14

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

我开始一个新的线程在文档中解释:[1]

return ThreadManager.createBackgroundThread(new Runnable() { ... });

如果我运行应用程序,一段时间后(在创建新线程时)会引发以下异常:

com.google.appengine.api.system.SystemFailureException: An unknown error occurred

这个[2]问题提到,如果应用编程接口超出配额,就会出现这个异常。所以我可以创建线程,但是过了一定时间异常就会出现。这就是为什么我认为后端有线程的限制。

[1]https://developers.google.com/appengine/docs/java/backends/overview#background_threads

[2] http://code.google.com/p/googleappengine/issues/detail?id=7398

共有3个答案

宗冷勋
2023-03-14

考虑到例外情况,我假设您使用的是Java。

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

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

为了记录在案,每个请求被限制为50个线程。

阅读这里的线程。

凌昕
2023-03-14

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

皇甫飞飙
2023-03-14

作为记录,App Engine区分了普通线程和后台线程,前者不能超过启动它们的HTTP请求,后者可以。

至少对于Python来说,生产(Python 2.7)运行时和dev_appserver都对每个后端施加了10个后台线程的固定限制,这与后端中的其他设置无关,例如max_concurrent_requests。亚马尔。

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

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

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

我希望这被记录下来!会节省我很多时间。

后端。亚马尔

- 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)
 类似资料:
  • 我正在尝试使用RxJava在后台线程上使用我的RoomDatabase。 我的DAO类: 我的实体类(为简洁起见省略了getter和setter方法): 最后,这里是我的MeasurementDatabase类: 在我的片段中,我试图在单击菜单项后插入背景线程: 最终测量数据库appDb= 我收到一个错误,说: 我的RxJava代码中缺少了什么,没有将进程放在后台线程上?

  • 当我调整窗口大小时,舞台以及包含的场景会正确调整大小,但是当我单击最大化按钮时,只有舞台被最大化,而不是里面的场景。更糟糕的是,没有手动更改场景高度和宽度的方法(这些是只读的)。我还尝试创建新场景并将旧场景的根元素放在里面,但后来我得到了一个例外,即2个场景不能具有相同的根元素。谢谢! 最小可再现示例: 我标记了单击“最大化”的时刻。谢谢

  • null 所以你可以不受任何限制地做背景工作。尽管由于这些原因您应该使用服务,但链接。 这是做背景工作的另一种方式(当然不是更好,但仍然是一种方式)吗?我错了吗?

  • 问题内容: 我需要在用户操作时执行目录副本,但是目录很大,因此我希望能够执行这样的操作,而用户却不知道完成副本所花费的时间。 任何建议将不胜感激。 问题答案: 假设它在Linux机器上运行,我总是这样处理: 这将启动命令,将命令输出重定向到,并将进程ID写入。 这样一来,您可以轻松地监视该进程在做什么以及它是否仍在运行。

  • 问题内容: 我想在后台线程中运行一些Runnable。我想使用Handler,因为它便于延迟。我的意思是 凡 可运行 应当运行 后台 线程。是否可以创建这样的处理程序?是否在某个地方有“背景” Looper,或者该如何创建? PS我知道如何使用自定义类扩展Thread,但是比处理程序方式需要更多的编码工作。因此,请不要发布其他解决方案或类似的内容 如果Handler能以“干净”的方式做到这一点,我