【问题标题】:Opa flow control, threading?Opa流控制,线程?
【发布时间】:2012-09-21 16:14:21
【问题描述】:

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

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

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

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

提前致谢,因为我是 Opa 的新手,正在努力了解它的功能!

【问题讨论】:

    标签: javascript multithreading node.js asynchronous opa


    【解决方案1】:

    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 访问调度原语

    【讨论】:

    • 谢谢!正是我想要的。除了 Opa Manual Docs,还有什么好的 Opa 学习资源推荐吗?
    【解决方案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 语法进行了一些简化和更新。)

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 2011-10-14
      相关资源
      最近更新 更多