gpt4 book ai didi

java - 在google appengine后端仅运行一个后台线程

转载 作者:行者123 更新时间:2023-12-01 12:20:20 26 4
gpt4 key购买 nike

documentation 中所述我在后端无限运行一个后台线程,有 1 个实例,以进行一些连续的后台处理。

import com.google.appengine.api.ThreadManager;
import java.util.concurrent.AtomicLong;

AtomicLong counter = new AtomicLong();

Thread thread = ThreadManager.createBackgroundThread(new Runnable() {
public void run() {
try {
while (true) {
counter.doStuff()
Thread.sleep(10);
}
} catch (InterruptedException ex) {
throw new RuntimeException("Interrupted in loop:", ex);
}
}
});
thread.start();

我已将此代码绑定(bind)到 _ah/start 端点,以便在实例启动后执行它。然而,在本地服务器中运行时,我看到 _ah/start 请求在运行时多次传入,并且它启动了多个此类线程。我一次只需要一个线程存在,以减少后台处理中的争用。

是否有任何方法可以捕获现有的 bg 线程并检查其是否正在运行,从而避免创建新线程?

更新将此代码上传到云后,我还观察到每次在后端调用 _ah/start 时,它都会生成一个新线程作为 _ah/background 端点的一部分并保持运行。这样,如果我们无法停止较早的线程,就会有许多线程一起运行。

最佳答案

后端实例可能不是您所需要的。

事情是这样的:您想在服务器上运行无限处理。后端并不是为此目的。您可能需要考虑针对该特定场景在 Compute Engine 上分拆虚拟机。

后端用于在后台运行长时间操作。这些操作通常是由用户请求的。您的情况有所不同,这就是我考虑 VM 场景的原因。

无论如何,特别是对于您遇到的问题,运行线程的实例实际上并未接收多个 _ah/start 请求。每个实例仅接收这些请求之一。然而,系统正在尝试通过多个 _ah/start 请求来分离多个实例。我不知道为什么,但显然有些东西要求后端多次出现。

为了避免内存中出现多个线程,您可以做的就是每当一个线程运行时在 Memcache 中添加一个标志(该标志为所有后端共享)。每次线程启动时,检查该标志是否不存在。如果是,则不要启动线程。

确保您还实现了 _ah/stop 请求以从内存缓存中删除该标志。

希望这有帮助。

关于java - 在google appengine后端仅运行一个后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26709538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com