我有一个异步任务处理器,我希望迁移到使用新的CompletableFuture语法,因为这最初似乎是一种更自然的方式来管理我的任务依赖关系,我找不到的关于CompletableFuture的指南都没有覆盖我的案例,所以我正在寻找一些关于最佳方法的建议:
CompletableFuture.allOf
)。当前实现使用ThreadPoolExecutor和ExecutorCompletionService:
AtomicInteger
正在进行的CompletionService.poll(timeout)
个任务中循环调用Future.get()
Executor.shutdownNow()
来收集报告,然后运行一些依赖关系管理代码,以将任何现在未被阻止的任务添加到执行程序。 (并妥善管理正在进行的任务的数量)。CompletableFuture
清除队列并停止任何进一步的任务,输出结果,它有一个尽可能有用的错误消息。 当正在进行的任务数量达到0时,主控制循环结束,代码执行整齐关闭并为用户输出有关其任务执行情况的报告。
缺点是存在大量的样板,管理轮询,异常处理和提交相关的依赖项,依赖管理器和执行程序紧密耦合。
表面CompletableFuture.supplyAsync()
似乎非常有用。构建了依赖关系树并对其进行了排序后,我可以迭代树并使用CompletableFuture.allOf()
来执行没有依赖关系的任务,当我使用依赖关系执行任务时使用CompletableFuture<Report>[] dependencies = getBlockingTasks(task);
CompletableFuture<Void> allOf = CompletableFuture.allOf(dependencies);
CompletableFuture<Report> future = allOf.thenApplyAsync(v -> executeTask(task)), threadPoolExecutor);
thenApply
我也可以使用thenAccept
和CompletableFuture<Void> allOf = CompletableFuture.allOf(allMyTasks);
allOf.join();
链接到每个工作线程处理报告并记录它。
我不确定的主要区域是异常处理和轮询/等待。如果我不想在需要花费一些时间的时候提供更新,我会使用:
import numpy as np
import theano
import theano.tensor as T
a = T.scalar('a')
b = T.scalar('b')
w = theano.shared(value = 1., name='w')
c = a * w + b
f = theano.function([a,b], c)
theano.printing.pydotprint(f, outfile="_f.png", var_with_name_simple=True)
x1 = T.scalar('x1')
x2 = T.scalar('x2')
y1 = theano.clone(c, replace={a:x1})
y2 = theano.clone(c, replace={a:x2})
y = y1 + y2
g = theano.function([x1,x2, b], y)
theano.printing.pydotprint(g, outfile="_g.png", var_with_name_simple=True)
print(g(1,2,3)) # print 9
我不确定管理异常处理的最佳方法。
所以(除了我发布的敏感片段之外),我能够跟踪我的任务完成状态的最佳方式是什么,所以如果事情正在进行,我可以继续向用户输出内容有一段时间,管理异常的最佳方法是什么,也许重要的是,这实际上是一种明智的模式,还是我被新的和闪亮的东西所吸引,做了一些我想要的事情&#34;?< / p>