2016-04-15 39 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(); 
}