Multithreading 非阻塞并发消息接收

Multithreading 非阻塞并发消息接收,multithreading,concurrency,d,nonblocking,Multithreading,Concurrency,D,Nonblocking,是否有一个标准函数来接收并发但非阻塞的消息?似乎std.concurrency中的所有可用函数都是阻塞的,我发现最接近非阻塞的函数是receiveTimeout,但它仍然等待超时。如果没有消息传递到线程,我希望它立即返回 下面是我使用receiveTimeout得出的结论 module main; import std.concurrency; import std.stdio : writefln, readln; import core.time; import core.thread;

是否有一个标准函数来接收并发但非阻塞的消息?似乎
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)
,是这里的最佳选择。而且它不会真正影响性能,因为非阻塞函数的实现和当前的超时函数并没有太大区别。如果退出函数时超时为负,则只需再执行一次
检查即可。

它是否适用于
0.dur!“nsec”
?可能吧,但我要寻找的是是否有一种标准的方法来做到这一点,最好是一种不涉及持续时间检查的方法如上所述,它完成了任务。
如果(period.isNegative | | |!m_putMsg.wait(period))返回falsensecs(-1)
这样的东西应该是最好的选择。非阻塞函数的实现与超时函数的实现没有太大区别。如果退出具有负超时的函数,则只需再执行一次
if
检查即可。