非阻塞并发消息接收



是否有一个标准函数可以并发但不阻塞地接收消息?似乎std.concurrency中所有可用的函数都是阻塞的,我发现最接近非阻塞的函数是receiveTimeout,但它仍在等待,直到超时。如果没有消息传递到线程,我希望它立即返回。

以下是我使用receiveTimeout得出的结果。

module main;
import std.concurrency;
import std.stdio : writefln, readln;
import core.time;
import core.thread;
void spawnedFunc() {
    while (true) {
        receiveTimeout(
            dur!("nsecs")(1),
            (int i) { writefln("Received %s", i); }
        );
        Thread.sleep(dur!("msecs")(100));
    }
}
void main() {
    auto tid = spawn(&spawnedFunc);
    while (true) {
        readln();
        send(tid, 42);
    }
}

更新:

我的最佳赌注是这样的函数吗?

void receiveNonBlocking(T...)(T ops) {
    receiveTimeout(
        dur!("nsecs")(1),
        ops
    );
}
...
receiveNonBlocking(
    (int i) { writefln("Received %s", i); }
);

查看receiveTimeout:的实现

if( period.isNegative || !m_putMsg.wait( period ) )
    return false;

因此,提供负超时,例如nsecs(-1),是这里的最佳选择。它并不会真正影响性能,因为非阻塞函数的实现和当前的超时函数并没有太大区别。对于超时为负的函数,在退出之前只需再执行一次if检查。

最新更新