非阻塞并发消息接收
Non-blocking concurrent message receive
是否有一个标准函数可以并发接收消息,但非阻塞?似乎 std.concurrency
中所有可用的函数都是阻塞的,我发现最接近非阻塞的函数是 receiveTimeout
,但它仍然会等到超时。如果没有消息传递给线程,我希望它立即 return。
这是我使用 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
检查。
是否有一个标准函数可以并发接收消息,但非阻塞?似乎 std.concurrency
中所有可用的函数都是阻塞的,我发现最接近非阻塞的函数是 receiveTimeout
,但它仍然会等到超时。如果没有消息传递给线程,我希望它立即 return。
这是我使用 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
检查。