Multithreading GAE线程池速度不一致
我正在谷歌应用程序引擎上设置一项服务。我需要该服务拨打五个外部服务电话,合并他们的结果,并返回合并后的答案。外部服务是我无法控制的 我设置了一个线程池,如下所示:Multithreading GAE线程池速度不一致,multithreading,google-app-engine,threadpool,java-7,Multithreading,Google App Engine,Threadpool,Java 7,我正在谷歌应用程序引擎上设置一项服务。我需要该服务拨打五个外部服务电话,合并他们的结果,并返回合并后的答案。外部服务是我无法控制的 我设置了一个线程池,如下所示: import com.google.appengine.api.ThreadManager; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent
import com.google.appengine.api.ThreadManager;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
// ...
Executor executor = new ThreadPoolExecutor(3,
10,
30,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(50),
ThreadManager.currentRequestThreadFactory());
// I looked into the backgroundThreadFactory(), but that would only
// work with a backend service, which is deprecated.
// ...
Collection<Result> doWork(List<Task> tasks) {
final ResultCollector collector = new ResultCollector(); // My own class to join results.
final CountDownLatch latch = new CountDownLatch(tasks.size());
for (Task task : tasks) { // My own worker class
executor.execute(new Runnable() {
@Override
public void run() {
task.execute(collector); // Does work, populates collector.
latch.countDown();
}
});
}
latch.await();
return collector.getResult();
}
import com.google.appengine.api.ThreadManager;
导入java.util.concurrent.CountDownLatch;
导入java.util.concurrent.LinkedBlockingQueue;
导入java.util.concurrent.ThreadPoolExecutor;
// ...
Executor Executor=新线程池Executor(3,
10,
30,
时间单位:秒,
新的LinkedBlockingQueue(50),
currentRequestThreadFactory());
//我查看了背景ThreadFactory(),但那只会
//使用不推荐使用的后端服务。
// ...
收集工作(列出任务){
final ResultCollector collector=new ResultCollector();//我自己的类来连接结果。
final CountDownLatch latch=新的CountDownLatch(tasks.size());
for(Task:tasks){//我自己的工人类
executor.execute(新的Runnable(){
@凌驾
公开募捐{
task.execute(收集器);//执行,填充收集器。
倒计时();
}
});
}
satch.wait();
返回collector.getResult();
}
然后我的服务电话开始不时超时。我输入了一些日志,发现在某些情况下,Runnable
的run()
调用在10秒或更长的时间内没有被调用。我不确定这是否是因为appengine正在为每个请求创建一个新的线程池。正如我在评论中所说,我不能使用backgroundThreadFactory
,因为它不是后端实例
在AppEngine中,有没有一种更高效的方法来并行进行这些调用