在google appengine后端只运行一个后台线程

正如在文档中提到的,我在后端运行一个后台线程,其中一个实例是无限的,用于一些连续的后台处理。

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(); 

我已将此代码绑定到_ah / start端点,以便在实例启动后执行它。 但是,当在本地服务器上运行时,我看到_ah / start请求在运行时期间多次出现,并且它启动了多个这样的线程。 我一次只需要一个线程来减少后台处理中的争用。

有没有办法抓住现有的bg线程并检查它是否正在运行,以便可以避免新的线程创建?

更新将此代码上传到云后我还观察到,每次在后端调用_ah / start时,它会生成一个新线程作为_ah / background端点的一部分并继续运行。 通过这种方式,如果我们无法阻止先前的线程,将会有许multithreading一起运行。

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

事情就是这样:你想在服务器上运行无限处理。 后端不是那个意思。 您可能需要考虑针对该特定方案在计算引擎上分离VM。

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

无论如何,特别是你遇到的问题,运行该线程的实例实际上并没有收到多个_ah / start请求。 每个实例仅接收其中一个请求。 但是,系统正在尝试使用多个_ah / start请求分离多个实例。 我不知道为什么,但显然有些东西要求后端多次出现。

你可以做些什么来避免内存中的多个线程在每个线程运行时在Memcache中添加一个标志(对所有后端共享)。 每次线程启动时,检查该标志是否不存在。 如果是,请不要启动该线程。

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

希望这可以帮助。