问题标签 [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.
c - 在 EAGAIN 之后强制阻止读取?
我有一个可以读取的文件描述符,它可能是非阻塞的。我需要做的是简单地读取所有数据,直到到达 EOF 并将该数据写入可写文件描述符。由于执行此复制的过程不“知道”周围发生的任何事情,我不认为我可以在等待数据时做一些有用的事情,而且我不想使用while
循环(whileerrno
是不是EAGAIN
),因为我认为这会很浪费。有没有办法阻止或以其他方式暂停复制过程的执行,直到数据可用?
c - O_NONBLOCK 是否被设置为文件描述符或基础文件的属性?
从我在 The Open Group 网站上阅读的内容来看,fcntl
我得到的印象是,是否在文件描述符上设置,因此非阻塞 I/O 是否与描述符一起使用,应该是该文件描述符而不是基础文件。例如,作为文件描述符的一个属性,如果我复制一个文件描述符或打开另一个描述符到同一个文件,那么我可以将阻塞 I/O 与另一个一起使用,而将非阻塞 I/O 与另一个一起使用。open
read
write
O_NONBLOCK
然而,尝试使用 FIFO,似乎不可能同时为 FIFO 提供阻塞 I/O 描述符和非阻塞 I/O 描述符(因此O_NONBLOCK
set 是否是底层文件 [the FIFO] 的属性):
这让我想:是否有可能对同一个文件有一个非阻塞 I/O 描述符和阻塞 I/O 描述符,如果是这样,它是否取决于文件的类型(常规文件、FIFO、块特殊文件、字符特殊文件、套接字等)?
java - 将简单的 java 对象从一个线程传递到另一个线程的快速方法
我有一个接收对象的回调。我制作了这个对象的副本,我必须将它传递给另一个线程以进行进一步处理。回调尽可能快地返回非常重要。理想情况下,回调会将副本写入某种无锁容器。
我只有从单个线程和一个处理线程调用的回调。
我只需要将一堆双打传递给另一个线程,并且我知道双打的最大数量(大约 40 个)。
有任何想法吗?我对Java不是很熟悉,所以我不知道在线程之间传递东西的常用方法。
twisted - Ruby EventMachine、Python Twisted 或 JavaScript Node.js 的意义/目的是什么?
我不明白这些框架解决了什么问题。它们是 Apache HTTPD、Tomcat、Mongrel 等 HTTP 服务器的替代品吗?或者他们更多?我为什么要使用它们……一些真实世界的例子?我见过无数的聊天室和广播服务的例子,但看不出这与例如设置一个 Java 程序来打开套接字并为每个请求分派一个线程有什么不同。
我想我了解非阻塞 I/O,但我不明白这与多线程 Web 服务器有何不同。对于 Node.js,我读到它只有一个线程,这可能比同时处理多个线程更有效,但这是这些框架和传统 Web 服务器之间的唯一区别吗?
linux - 使用 MSG_NONBLOCK 和 MSG_WAITALL 进行接收
我想使用recv
带有非阻塞标志 MSG_NONBLOCK 的系统调用。但是有了这个标志,系统调用可以在完整请求得到满足之前返回。所以,
- 我可以添加 MSG_WAITALL 标志吗?会不会阻塞?
- 或者我应该如何用非阻塞recv将阻塞recv重写到循环中
qt4 - PyQt 阻塞版本的 show()
我有一个相当 cpu 密集型的应用程序,但是所有 cpu 密集型的东西都是通过单击 QPushButton 来启动的。单击按钮时,隐藏的 QLabel 为 show()n。
显然, show() 是非阻塞的。不幸的是,这意味着 cpu 密集型的东西在标签 show() 启动之前实际上已经完成了一半。
如何进行节目屏蔽?或者当我单击按钮时如何使标签显示()正确?
相关代码:
parse_triggered 导致父类调用 parse() 函数,这是相当 cpu 密集型的。
java - Java / Groovy Socket - 检测以非阻塞方式关闭的套接字
我正在尝试创建一个小型 HTTP 代理,它可以根据需要重写请求/标头以满足我的要求。如果一个已经存在,请指出我。否则...
我写了一些几乎可以工作的东西。它可以做代理功能,但不能重写(还)。问题是,如果不进行阻塞读取,我无法检测到远程套接字何时关闭。对于这个东西的功能来说,它能够检测到套接字被关闭而不阻塞是至关重要的。我已经搜索了 Java API 文档,但我找不到任何迹象表明它甚至是可能的。这是我所拥有的:
关闭套接字的测试从未表明套接字已关闭。而且,正如我所提到的,我找不到任何关于如何在不进行阻塞读取的情况下检测流上的“文件结束”条件的示例。
必须有办法。这里有人知道它是什么吗?
c# - 如何在命名管道(c#)上进行非等待写入?
我正在使用 .net 3.5 命名管道,我的服务器端是:
当我使用 BinaryWriter 写入一些数据时,write() 调用本身不会返回,直到客户端在其 NamedPipeClientStream 上调用了 read()。
BinaryWriter 是:
我知道 NamedPipeServerStream 提供了 BeginRead/BeginWrite 但据我所知,命名管道应该允许流编写器在它们之上执行(如许多 Microsoft 给出的示例中所见)。
那么如何使我的 write() 到命名管道不等待?
提前感谢您的帮助。
c++ - 非阻塞 TCP 缓冲区问题
我觉得我有问题。我有两个相互连接的 TCP 应用程序,它们使用 winsock I/O 完成端口来发送/接收数据(非阻塞套接字)。
一切正常,直到出现数据传输突发。发件人开始发送不正确/格式错误的数据。
我在堆栈上分配要发送的缓冲区,如果我理解正确,那是错误的做法,因为这些缓冲区应该在我发送它们时保留,直到我从 IOCP 收到“写入完成”通知。
以此为例:
如果我理解正确,这些 WSASend() 调用中的每一个都应该有自己唯一的缓冲区,并且只有在发送完成时才能重用该缓冲区。
正确的?
现在,我可以实施哪些策略来维护大量此类缓冲区,我应该如何处理它们,如何避免性能损失等?
而且,如果我要使用缓冲区,这意味着我应该将要从源缓冲区发送的数据复制到临时缓冲区,因此,我会将每个套接字上的 SO_SNDBUF 设置为零,这样系统就不会重新复制我的内容已经复制了。你和我在一起吗?如果我不清楚,请告诉我。
multithreading - 扭曲/龙卷风等如何工作
我知道它们的工作方式与为每个用户创建一个线程不同。这究竟是如何工作的?
(“非阻塞”与它有关吗?)