Scala Continuations:挂起而不等待/sleep()



好吧,我已经准备好放弃了。

我想保存延续的状态(使用shift完成)。但是,需要注意的是,不应该执行重置后的代码。考虑由工作线程执行的延续,并且不应该再进行处理。延续被保存在可以继续的延续的全局列表中,之后的所有内容都被忽略,不应执行。

工作线程必须存活(不能中止或销毁,需要启动一个新线程)。

reset {
shift {
(cont:Unit=>Unit) =>
println(1)
suspend() // how would I implement something like this?
cont()
}
println(3)
}
println(2)

应产生

1

恢复继续应该会产生

3
2

目前这似乎根本不可能,因为继续仅限于重置的范围。但我想我会试试StackOverflow。


编辑:基本上。。。(也许我应该早点说)我想调用一个方法,并暂停执行,直到它准备好给我一个结果,我想通过事件循环而不是线程同步来实现这一点。

我不确定这是否适用于您的情况,但下面是如何混合多重重置的示例:

type Proc = Unit => Unit
val resume = reset {
shift { k1: Proc =>
reset {
shift { k2: Proc =>
println(1)
() => k2(); k1() 
}        
println(3)
}
}
println(2)
}
// 1
resume()
// 3
// 2

更新:以下是如何将其与方法一起使用:

def f(): Unit @cpsParam[Unit, () => Unit] = {
println(0)
shift { k1: Proc =>
reset {
shift { k2: Proc =>
println(1)
() => k2(); k1()
}        
println(2)
}
}
println(3)
}
val continue = reset {
println(-1)
f()
println(4)
}
println("...")
continue()

打印:

-1
0
1
...
2
3
4

如果你不想在调用f后暂停所有操作,直到重置结束,该怎么办:

reset {
println(-1)
shift { k: Proc =>
reset{f()}()
k()
}
println(4)
}
println("...")

打印:

-1
0
1
2
3
4
...

最新更新