有这么一个函数:
public void increase(String key) {
int val = storage.get(key);
storage.put(key, val + 1);
}
我需要有一系列的key需要操作,那么就必须弄一个循环:
for (String key : keys) {
increase(key);
}
如果storage是一个网络上的设备,key又非常多。这就会造成非常多次的网络操作。假设有500个key,每次网络操作是100ms。那么就需要耗费500 * 0.1 * 2 = 100秒的时间。
那么怎么解决这个问题呢?最直观的想法就是批量:
public void increase(Collection<String> keys) {
Map<String, Integer> vals = storage.get(keys);
for (Map.Entry<String, Integer> entry : vals) {
entry.setValue(entry.getValue() + 1);
}
storage.put(vals);
}
但是这样做的问题是所有使用increase的地方也必须是批量处理的了。底层的一个优化扩散到了最上层,使得整体的逻辑变复杂了。
最后的解决办法是:
public interface Storage {
Continuable<Integer> get(String key);
Continuable<Void> put(String key, String value);
}
public Continuable<Void> increase(final String key) {
return new Continuable<Void>(){
private Future<String> val;
protected void step1() {
val = $yield(storage.get(key));
}
protected void step2() {
$yield(storage.put(val.get() + 1));
}
protected void step3() {
$return();
}
};
}
而Continuable.java实现的就是$return和$yield,把一个完整的函数打散成step来执行。
分享到:
相关推荐
jyield 旨在提供类似于协程的 java 延续支持。 使用@Continuable 注释的方法在运行时或可选地在编译时进行转换。特征发电机续集链接延续执行状态序列化支持尝试 catch 块支持同步块支持代码示例 import jyield....
Android custom view and progress for Continuable CountDownView. You can feel free to contribute and add new features or bug fixes. Thank you. Screen Usage You can define values on you XML file or you...
}}function map ( source , lambda ) { return function continuable ( callback ) { source ( function ( err , value ) { callback ( err , err ? null : lambda ( value ) ) } ) }}var asString = map ( ...
4. **workflow-cps-global-lib**:Workflow Continuable Shared Libraries 插件扩展了 Jenkins Workflow 功能,允许用户定义全局的、可重用的工作流脚本库。 5. **git**:Git 插件是 Jenkins 中非常基础的一个,它使...
您可以找到语言规范它与Java脚本具有很好的互操作性。特征继承: 程序是用JSON或简单的Javascript数组树编写的。 巨集尾部呼叫优化(TCO) Javascript互操作性错误处理无依赖关系(用作库) 和更多... 暂停/恢复在...
Continuable是一个C ++ 14库,它为以下各项提供完全支持: 基于回调(然后)和表达式模板的惰性异步继续链接,回调被很好地包装为promises 。 无需强制类型擦除,这意味着我们严格按照“不为不使用的内容付费”的...