问题标签 [nonblocking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
22913 浏览

sockets - 如果带有 MSG_PEEK 的非阻塞接收成功,那么后续没有 MSG_PEEK 的接收也会成功吗?

这是我正在处理的一些代码的简化版本:

如果我们假设第一次调用 recv 成功,返回一个 1 到 32 之间的值,那么假设第二次调用也会成功是否安全?ret2 可以小于 ret1 吗?在哪些情况下?

(为了清楚起见,假设在第二次调用 recv 期间没有其他错误条件:没有传递信号,它不会设置 ENOMEM 等。还假设没有其他线程会查看 fd。

我在 Linux 上,但我相信 MSG_DONTWAIT 是这里唯一特定于 Linux 的东西。假设之前在其他平台上设置了正确的 fnctl。)

0 投票
1 回答
6410 浏览

c++ - 使用 WinSocks 的非阻塞 connect()

根据MSDN,您必须像这样创建一个非阻塞套接字:

然后在 write-fdset 中使用它select()。要检查连接是否成功,您必须查看套接字是否可写。但是,MSDN 文章没有描述如何检查错误。

我如何查看是否没有connect()成功,如果是这样,为什么它没有成功?

0 投票
3 回答
3807 浏览

ruby - 是否有一种简单的方法来检查 Ruby IO 实例是否会在 read() 上阻塞?

我正在寻找 Ruby 中的一种方法,基本上是这样的:

我只想检查给定IO对象(在我的例子中,popen调用的结果)是否有可用的输出,即后续调用io.read(1)不会阻塞。

这是我看到的两个选项,我都不喜欢:

  1. io.read_nonblock- Unix 的抽象太薄了read()- 我不想处理errno错误处理。

  2. io.selectwith timeout 0 -- 混淆了这个简单操作的目的。

有没有我忽略的更好的选择?

0 投票
6 回答
22056 浏览

ruby - 在 Ruby 中检测没有 getc/gets 的按键(非阻塞)

我有一个简单的任务,需要等待文件系统上的某些东西发生变化(它本质上是一个原型编译器)。所以我有一个简单的无限循环,在检查更改的文件后休眠 5 秒。

而不是Ctrl+C敬礼,我宁愿能够测试并查看是否按下了某个键,而不会阻塞循环。本质上,我只需要一种方法来判断是否有传入的按键,然后抓住它们直到遇到 Q,然后退出程序。

我想要的是:

或者,这是 Ruby 没有做的事情(很好)?

0 投票
1 回答
1174 浏览

perl - IO::Select 中的 select() 包装器是线程安全的吗?如何解决?

假设我有一个线程:

由于我没有提供超时select()并且它无限期地阻塞,直到在一个描述符(好吧,“句柄”)集上检测到活动,如果另一个线程修改集的内容(例如添加一个新的套接字进行轮询)会发生什么?

相对于 Perl POSIX 线程实现,它是否以线程安全的方式实现?

如果没有,我想我可以将阻塞select()调用放在具有自己范围的块中并锁定集合,或者更清楚地说,锁定整个包数据。从另一个线程唤醒select()以返回以便可以操作集合的内容的最佳方法是什么?线程特定的信号?信号?欢迎提出建议。

非常感谢!

编辑:嗯,线程特定的“信号”出来了。如此处所述(http://perldoc.perl.org/threads.html):“相应地,向线程发送信号不会中断线程当前正在处理的操作:信号将在当前操作之后执行已经完成。例如,如果线程卡在 I/O 调用上,向其发送信号不会导致 I/O 调用中断,从而立即执行信号。

这仍然让我想知道select()如果我希望它无限期地阻塞而不是在固定超时后返回,我应该如何处理在线程中唤醒的问题。

0 投票
10 回答
104436 浏览

c# - Simplest way to do a fire and forget method in C#?

I saw in WCF they have the [OperationContract(IsOneWay = true)] attribute. But WCF seems kind of slow and heavy just to do create a nonblocking function. Ideally there would be something like static void nonblocking MethodFoo(){}, but I don't think that exists.

What is the quickest way to create a nonblocking method call in C#?

E.g.

NB: Everyone reading this should think about if they actually want the method to finish. (See #2 top answer) If the method has to finish, then in some places, like an ASP.NET application, you will need to do something to block and keep the thread alive. Otherwise, this could lead to "fire-forget-but-never-actually-execute", in which case,of course, it would be simpler to write no code at all. (A good description of how this works in ASP.NET)

0 投票
3 回答
2847 浏览

java - Java Linux 非阻塞套接字超时行为

我有一个 Java 非阻塞服务器,它跟踪选择器中的所有套接字通道。然后我与服务器建立 500 个连接并定期发送数据。服务器接收到的每条数据都会回显给客户端。

问题出现在测试工作出色的几个小时,然后突然间,服务器管理的所有套接字在尝试读取数据时都会抛出 Connection timed out IOException。

我已经查看了客户端线程是否被饿死(而不是发送数据),但我正在让客户端线程遍历所有套接字并写出数据。流量似乎一直在正常流动,但一段时间后它就全部消失了。任何想法可能导致这种行为?

我正在使用最新版本的 Java 6 的 Linux 平台上运行。我的应用程序启动两个线程,一个用于服务器,一个用于所有客户端。提前致谢!

额外: 问题是处理 Linux 而不是我的代码。当我在 Windows 机器上(在同一硬件上)运行完全相同的设置时,它永远不会超时,但几个小时后它们开始在 Linux 上发生。一定是Linux中的某种TCP设置导致它发生。谢谢你的建议。

0 投票
7 回答
3281 浏览

java - Java 是否有基于推送/非阻塞的 XML 解析器?

我正在寻找一个 XML 解析器,而不是从 InputStream 或 InputSource 进行解析,而是允许将文本块推送到解析器中。例如,我想要以下内容:

原因是我想要一些可以与 NIO 网络库配合使用的东西,而不是必须恢复到支持阻塞 InputStream 所需的每个连接模型的线程。

0 投票
4 回答
3537 浏览

c++ - 加速非阻塞 Unix 套接字 (C++)

我已经实现了一个简单的套接字包装类。它包括一个非阻塞功能:

该类还包含一个简单的接收函数:

实际上,调用 Socket::recv() 时似乎有大约 15 毫秒的延迟。这种延迟是可以避免的吗?我见过一些使用 select() 的非阻塞示例,但不明白这可能有什么帮助。

0 投票
1 回答
2092 浏览

bash - bash中非阻塞fifo的问题

我正在运行一些 Team Fortress 2 服务器,我想编写一个小管理脚本。

基本上,TF2 服务器是一个提供服务器控制台的 fg 进程,因此我可以启动服务器,输入状态并从中获得答案:

太好了,现在我想创建一个脚本,将命令 sm_reloadadmins 发送到我的所有服务器。我发现做到这一点的最好方法是使用 fifo 命名管道。现在我想要做的是让这个管道只读且非阻塞到服务器进程,所以我可以写入管道并且服务器执行它,但我仍然想通过控制台写入服务器,所以如果我切换回服务器的 fg 进程,我输入 status 我想打印一个答案。

我试过这个(假设serverfifo是mkfifo serverfifo):

不工作,服务器不会启动,直到有东西被写入管道。

这实际上工作得很好,我可以看到服务器的控制台输出,我可以写入 fifo 并且服务器执行命令,但我不能再通过控制台写入服务器了。此外,如果我将“退出”写入管道(应该结束服务器)并且我在屏幕上运行它,屏幕窗口会因某种原因被杀死(为什么?)。

我只需要服务器在不阻塞的情况下读取fifo,并且服务器本身上的所有键盘输入都应该发送到服务器,并且所有服务器输出都应该写入控制台。

那可能吗?如果是,如何?