非阻塞并发消息接收

4

是否有一种标准的函数可以实现并发非阻塞接收消息?看起来所有在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); }
);

2
它不能用 0.dur!"nsec" 工作吗? - sigod
可能吧,但我想找的是是否有一种标准方法来做这件事,最好不涉及持续时间检查。 - Bauss
1
就我个人而言,我也使用了如上所建议的 receiveTimeout (0.msecs);,它确实起到了作用。 - Gassa
1
如果(period.isNegative ||! m_putMsg.wait(期间))返回false; 这样,像nsecs(-1)这样的东西应该是最好的选择。 非阻塞函数的实现与具有超时的函数的实现几乎没有什么不同。 只需在退出之前执行一个更多的if检查即可执行具有负超时的函数。 - sigod
1个回答

1
查看receiveTimeout的实现:
if( period.isNegative || !m_putMsg.wait( period ) )
    return false;

所以,在这里提供负超时,例如nsecs(-1),是最好的选择。而且它不会真正影响性能,因为非阻塞函数的实现与当前带有超时的函数并没有太大不同。只需要在具有负超时的函数退出之前执行一个额外的if检查即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接