Node.js本身支持工作线程和子进程的创建。 那些使用过Node.js的人可能熟悉流控制库,如Async.js或Step。
既然Opa在Node.js堆栈上运行,有没有办法将Async.js库用作javascript模块?
是否有Opa语言的任何绑定允许线程或某种异步流控制? 我怀疑没有,但我很好奇在Opa中实现线程或异步流量控制的可能选项?
*现在我知道我可以用非Opa语言将我的工作转移到另一个脚本,但这是我唯一的选择吗?
提前感谢,因为我是Opa的新手并且正在努力了解它的功能!
答案 0 :(得分:5)
Opa编译器自动将您的代码重写为异步Javascript代码。
这是Opa的功能之一,您不应该处理线程管理,它默认由编译器处理。
此外,Opa提供了一些并发原语来访问其控制流。
@callcc : continuation('a) -> 'a
@spawn : 'a -> Cps.future('a)
@wait : Cps.future('a) -> 'a
@callcc
允许访问当前延续的位置。这里是一个使用示例,从异步函数构建一个同步函数:
function ('a -> 'b) to_sync(('a, ('b -> void) -> void) fasync){
function (a){
@callcc(function(k){
fasync(a, Continuation.return(k, _))
})
}
}
并@spawn
在另一个'线程'上启动值的计算。 @wait
用于获取衍生值。作为伪示例:
function example(){
future = @spawn(
x = fibo(30);
jlog("End of spawn computation {x}");
{result : x}
)
// ...
jlog("do something before wait")
result = @wait(future).result
jlog("the result is [resulr}")
}
//Output of example is :
// do something before wait
// the result is 832040
您还可以使用Scheduler
module
答案 1 :(得分:2)
Opa内置了对异步服务器调用的支持。不幸的是,目前没有详细记录。但请考虑:
@async server function my_async_function() {
Scheduler.wait(2000);
#done = "async function done!"
}
function clicked() {
my_async_function();
#clicked = "you clicked me!"
}
function go() {
Resource.page("hello", (
<>
<p>click this button:</p>
<button onclick={function(_) { clicked() }}>
clickme</button>
<div id=#clicked/>
<div id=#done/>
</>
))
}
Uri.relative -> resource function start(uri) {
match (uri.path) {
| _ : go()
}
}
Server.start(Server.http,
{ dispatch: start }
)
(这类似于this mailing list thread中的示例,但稍微简化并更新了当前默认的Opa语法。)