在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端点的一部分,并保持运行。这样,如果我们不能停止前面的线程,就会有很多线程一起运行。

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

事情是这样的:您希望在服务器上运行无限的处理。后端并不意味着这样。您可能需要考虑为该特定场景在计算引擎上剥离VM。

后端用于在后台运行长时间操作。这些操作通常是由用户请求的。你的情况不同,这就是为什么我会考虑虚拟机场景。

无论如何,特别是针对您遇到的问题,运行线程的实例实际上并没有接收到多个_ah/start请求。每个实例只接收其中一个请求。然而,系统正试图通过几个_ah/start请求来剥离多个实例。我不知道为什么,但显然有什么东西要求后端出现多次。

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

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

希望这能有所帮助。

最新更新