Node.JS最大的优点是它具有非阻塞性.它是单线程的,因此不需要为每个新的传入连接生成一个新线程.
在事件循环(实际上是单线程)后面,有一个"非阻塞工作者".这个东西不再是单线程了,所以(据我所知)它可以为每个任务生成一个新线程.
也许我误解了一些东西,但究竟哪里有优势.如果要处理的任务很多,那么非阻塞工作会不会变成阻塞工作者?
谢谢Christian
我是Python新手,目前必须编写一个python套接字作为脚本运行,通过TCP/IP(气象站)与设备通信.
该设备充当服务器端(通过IP侦听:PORT,接受连接,接收请求,传输数据).
我只需要发送一条消息,接收答案,然后安静地关闭并关闭套接字.
try:
comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(1)
try:
comSocket.connect((''))
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(2)
comSocket.send('\r')
comSocket.recv(128)
comSocket.send('\r')
comSocket.recv(128)
comSocket.send('\r\r')
comSocket.recv(128)
comSocket.send('1I\r\r3I\r\r4I\r\r13I\r\r5I\r\r8I\r\r7I\r\r9I\r\r')
rawData = comSocket.recv(512)
comSocket.shutdown(1)
comSocket.close()
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是:
通信通道不可靠,设备很慢.因此,有时设备响应长度为0的消息(只是一个ACK),我的代码将冻结并等待永久响应.
这段代码包含涉及SOCKET的部分,整个代码将在CRON下运行,因此冻结不是理想的行为.
我的问题是:
在Python中处理该行为的最佳方式是什么,以便代码不会冻结并永远等待,但会尝试继续下一个发送(或类似).
有没有办法在shell中创建非阻塞/异步命名管道或类似的东西?所以程序可以在其中放置行,这些行将保留在ram中,并且当某个程序可以从管道读取一些行时,同时留下它没有在fifo中读取的内容?程序也很可能同时写入和读取这个fifo.起初我可能这可能是使用文件来完成的,但是在搜索了一下web之后,似乎没有什么好处可以来自同时读取和写入文件的事实.命名管道几乎可以工作,只有两个问题:首先,如果在另一端没有人阻止读/写,第二,即使我让写入被阻止并设置两个进程写入管道而没有人正在读取,通过尝试为每个进程写一行,然后尝试head -n 1 <fifo>我只需要一行,但两个写入进程终止,第二行丢失.有什么建议?
编辑:也许一些中间程序可以用来帮助解决这个问题,就像作家和读者之间的中介一样?
我有一个使用libuv库的应用程序.它运行默认循环:
uv_run(uv_default_loop());
Run Code Online (Sandbox Code Playgroud)
如果发生故障,如何正常退出应用程序?目前我正在这样做,如下例所示:
uv_tcp_t* tcp = malloc(sizeof(uv_tcp_t));
int r = uv_tcp_init(uv_default_loop(), tcp);
if (r) {
free(tcp);
uv_loop_delete(default_loop);
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
应该uv_loop_delete调用函数吗?它有什么作用?它是否会丢弃所有待处理的回调函数?它是否关闭所有当前打开的TCP连接?退出前我是否必须手动完成?
PS:无法添加标签'libuv'(声誉低于1500).有人可以创建并添加它吗?
对我来说,下面是异步和非阻塞I/O最可能的定义:
Asynchronous I/O: 在异步I/O应用程序中立即返回,OS将在字节可用于处理时让他们知道.
NON-blocking I/O: 这里应用程序立即返回可用的数据和应用程序应该具有轮询机制以找出何时准备好更多数据.
知道这些定义,如果我们分析Java通道即后SocketChannel,ServerSocketChannel,DatagramSocketChannel那么我们可以发现,这些信道可以被用作阻挡或通过该方法非阻塞模式configureBlocking(boolean block).并假设我们将它们用作非阻塞模式.所以这里有问题:
如果我将使用Selector ie寄存器通道来selector确定它是异步I/O还是非阻塞I/O?
我觉得这是java中的异步I/O,当且仅当底层操作系统通知java应用程序有关通道的准备选择时.否则它是非阻塞I/O,并且selector正如我在定义中提到的那样,它只是帮助我们轮询上述通道的机制.哪个是对的?提前致谢.
编辑:
我已经回答了问题的一部分,即I/O的类型以及java如何促进这些功能.
但仍有一个问题仍然是java是否提供所有这些功能是在java层模拟还是使用底层操作系统来促进?假设底层操作系统具有对这些功能的所有支持.
请参考答案.
在https://pragprog.com/book/tbajs/async-javascript这本书中,我发现了这个:
Node的早期迭代在其非阻塞API中使用了Promises.然而,在2010年2月,Ryan Dahl做出了切换到现在熟悉的回调(错误,结果......)格式的决定,理由是Promises是属于"userland"的更高级别的构造.
它看起来很混乱,因为作为读取文件的API,这个
fs.readFile('/etc/passwd')
.onSuccess(function(data){console.log(data)})
.onError(function(err){throw err})
Run Code Online (Sandbox Code Playgroud)
看起来比这更好:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么"Promise是一个更高级别的构造"会阻止自己在NodeJS API中使用?
CompletableFutureJDK 8中引入的内容与io.netty.util.concurrent.FutureNetty提供的内容相比如何?
Netty文档提到了这一点
JDK 8添加了CompletableFuture,它与http://netty.io/wiki/using-as-a-generic-library.html有些重叠
io.netty.util.concurrent.Future
我试图得到答案的问题是:
关于相似点/不同点,我能够提出以下建议:
相似之处: 基本的相似之处在于,与Java Future相比,两者都是非阻塞的.这两个类都有可用于向未来添加侦听器,内省失败和任务成功的方法,并从任务中获取结果.
差异:
CompletableFuture似乎有更丰富的界面来组合多个异步活动等.io.netty.util.concurrent.Future另一方面,Netty 允许将多个侦听器添加到同一个Future,而且允许删除侦听器.
我需要使用Jersey构建一个web服务,从另一个服务下载一个大文件并返回给客户端.我希望jersey将一些字节读入缓冲区并将这些字节写入客户端套接字.
我希望它使用非阻塞I/O,所以我不要让线程忙.(这无法实现)
@GET
@Path("mypath")
public void getFile(final @Suspended AsyncResponse res) {
Client client = ClientBuilder.newClient();
WebTarget t = client.target("http://webserviceURL");
t.request()
.header("some header", "value for header")
.async().get(new InvocationCallback<byte[]>(){
public void completed(byte[] response) {
res.resume(response);
}
public void failed(Throwable throwable) {
res.resume(throwable.getMessage());
throwable.printStackTrace();
//reply with error
}
});
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有这个代码,我相信泽西岛将下载完整的文件,然后将其写入客户端,这不是我想要做的.有什么想法吗??
假设我由于某些第三方库而具有阻塞功能。沿着这些思路:
fun useTheLibrary(arg: String): String {
val result = BlockingLibrary.doSomething(arg)
return result
}
Run Code Online (Sandbox Code Playgroud)
对 的调用BlockingLibrary.doSomething应该在单独的ThreadPoolExecutor.
使用 kotlin 实现这一目标的正确方法是什么(假设有一种方法)?
注意:我已经读过这篇文章,但似乎已经过时了
nonblocking ×10
java ×3
asynchronous ×2
blocking ×2
javascript ×2
node.js ×2
c ×1
exit ×1
fifo ×1
io ×1
java-8 ×1
jersey ×1
kotlin ×1
libuv ×1
linux ×1
netty ×1
nio ×1
pipe ×1
promise ×1
python ×1
redis ×1
scalability ×1
shell ×1
sockets ×1
web-services ×1