1

Node.js 本身支持工作线程和子进程的创建。使用过 Node.js 的人可能熟悉 Async.js 或 Step 等流控制库。

现在由于 Opa 在 Node.js 堆栈上运行,有没有办法将 Async.js 库用作 javascript 模块?

Opa 语言是否有任何绑定以允许线程或某种异步流控制?我怀疑不是,但我很好奇在 Opa 中实现线程或异步流控制的可能选项是什么

*现在我知道我可以用非 Opa 语言完成并将我的工作转交给另一个脚本,但这是我唯一的选择吗?

在此先感谢,因为我是 Opa 的新手,并且正在尝试了解它的功能!

4

2 回答 2

5

Opa 编译器自动将您的代码重写为异步 Javascript 代码。

这是 Opa 的特性之一,你不应该关心线程管理,它默认由编译器处理。

此外,Opa 提供了一些并发原语来访问其控制流。

@callcc : continuation('a) -> 'a
@spawn : 'a -> Cps.future('a)
@wait : Cps.future('a) -> 'a

Where@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

于 2012-10-01T09:19:31.323 回答
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 }
)

(这与这个邮件列表线程中的示例类似,但对当前默认的 Opa 语法进行了一些简化和更新。)

于 2012-09-30T19:39:00.330 回答