2016-04-15 37 views
1

我想根据Naughy Dogs fiber based task system实现我自己的任务系统。D是否有期货/承诺?

我想这样做,大致是这样的

auto fiber = new Fiber((){ 
    someFunction(); 
}); 

然后我想给的是光纤到我创建一个线程。这应该不成问题。

但有时候我想得到一个结果,也许someFunctionint function()类型。

auto t = task!someFunction(); 
auto fiber = new Fiber((){ 
    task.yieldForce; 
}); 
submitFiberToSomeThreadPool(fiber); 

但似乎我不能使用这样的Task。看来我必须将它提交到Taskpool中,否则我必须拨打executeInNewThread,这是我不想要的。

这是否意味着我将不得不实施我自己的未来承诺系统?

+0

所以要纤维和来电之间来回传递值/将它们作为屈服函数的参数? – WebFreak001

+0

我检查了演示文稿,标题为“并行化使用纤维的淘气狗引擎”引起了我的注意。 - 某人如何将术语“平行”和“纤维”放在一起? – DejanLekic

+0

纤维与平行度之间没有任何内在矛盾。这本身并不常见:)使用N纤维+ M线比使用N线更适合并行性,这是我在不阅读演示文稿时所期望的。 –

回答

2

Fiber是一个非常基本的原语。有一个在vibe.d实施更加更高级别的任务系统 - 特别是你的问题似乎符合了http://vibed.org/api/vibe.core.concurrency/async

import vibe.core.core; 
import vibe.core.concurrency; 

void main () 
{ 
    // "root" task, necessary as one can't suspend main 
    // thread as it isn't wrapped by fiber 
    runTask({ 
     auto future = async({ 
      sleep(500.msecs); 
      return 42; 
     }); 

     sleep(250.msecs); 
     int value = future.getResult(); 

     exitEventLoop(); 
    }); 

    runEventLoop(); 
}