D有期货/承诺吗?

时间:2016-04-15 11:26:05

标签: d

我想基于Naughy Dogs fiber based task system实现我自己的任务系统。

我想大致像这样做

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

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

但有时候我希望得到一个结果,也许someFunction的类型为int function()

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

但似乎我不能像这样使用Task。我似乎必须将它提交到Taskpool中,或者我必须调用executeInNewThread这是我不想要的。

这是否意味着我必须实施我自己未来的承诺系统?

1 个答案:

答案 0 :(得分: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();
}