标签: nonblocking

单线程事件循环与Node.JS中的多线程非阻塞工作器

Node.JS最大的优点是它具有非阻塞性.它是单线程的,因此不需要为每个新的传入连接生成一个新线程.

在事件循环(实际上是单线程)后面,有一个"非阻塞工作者".这个东西不再是单线程了,所以(据我所知)它可以为每个任务生成一个新线程.

也许我误解了一些东西,但究竟哪里有优势.如果要处理的任务很多,那么非阻塞工作会不会变成阻塞工作者?

谢谢Christian

javascript nonblocking node.js

11
推荐指数
2
解决办法
8700
查看次数

UNLINK命令总是优于DEL命令吗?

在Redis 4.0中,有一个新命令UNLINK用于删除Redis内存中的密钥.

此命令与DEL非常相似:它删除指定的键.就像DEL一样,如果密钥不存在则会被忽略.但是,该 命令在另一个线程中执行实际内存回收, 因此它不会阻塞,而DEL则是.这是命令名称的来源:命令只是从键空间取消链接键.实际删除将在以后异步发生.

所以总是(100%次)使用UNLINK而不是DEL,因为UNLINK是非阻塞的,不像DEL,对吗?

nonblocking blocking redis

11
推荐指数
2
解决办法
2392
查看次数

Python:非阻塞套接字或Asynchronos I/O.

我是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中处理该行为的最佳方式什么,以便代码不会冻结并永远等待,但会尝试继续下一个发送(或类似).

python sockets nonblocking

10
推荐指数
2
解决办法
3万
查看次数

shell/filesystem中的非阻塞/异步fifo /命名管道?

有没有办法在shell中创建非阻塞/异步命名管道或类似的东西?所以程序可以在其中放置行,这些行将保留在ram中,并且当某个程序可以从管道读取一些行时,同时留下它没有在fifo中读取的内容?程序也很可能同时写入和读取这个fifo.起初我可能这可能是使用文件来完成的,但是在搜索了一下web之后,似乎没有什么好处可以来自同时读取和写入文件的事实.命名管道几乎可以工作,只有两个问题:首先,如果在另一端没有人阻止读/写,第二,即使我让写入被阻止并设置两个进程写入管道而没有人正在读取,通过尝试为每个进程写一行,然后尝试head -n 1 <fifo>我只需要一行,但两个写入进程终止,第二行丢失.有什么建议?

编辑:也许一些中间程序可以用来帮助解决这个问题,就像作家和读者之间的中介一样?

linux shell pipe nonblocking fifo

10
推荐指数
1
解决办法
6036
查看次数

libuv:如何在错误上优雅地退出应用程序?

我有一个使用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).有人可以创建并添加它吗?

c nonblocking exit libuv

10
推荐指数
1
解决办法
2107
查看次数

java Selector是异步或非阻塞体系结构

对我来说,下面是异步和非阻塞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层模拟还是使用底层操作系统来促进?假设底层操作系统具有对这些功能的所有支持.

请参考答案.

java io asynchronous nio nonblocking

10
推荐指数
1
解决办法
3456
查看次数

为什么NodeJS不使用Promise作为readFile API?

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中使用?

javascript asynchronous nonblocking node.js promise

10
推荐指数
2
解决办法
3625
查看次数

Java 8 CompletableFuture与Netty Future

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

我试图得到答案的问题是:

  1. 他们的异同是什么?
  2. 两者的性能特征如何不同?哪一个能够更好地扩展?

关于相似点/不同点,我能够提出以下建议:

相似之处: 基本的相似之处在于,与Java Future相比,两者都是非阻塞的.这两个类都有可用于向未来添加侦听器,内省失败和任务成功的方法,并从任务中获取结果.

差异: CompletableFuture似乎有更丰富的界面来组合多个异步活动等.io.netty.util.concurrent.Future另一方面,Netty 允许将多个侦听器添加到同一个Future,而且允许删除侦听器.

java nonblocking netty java-8 completable-future

10
推荐指数
1
解决办法
2302
查看次数

Jersey webservice可扩展的方法来下载文件并回复客户端

我需要使用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)

到目前为止,我有这个代码,我相信泽西岛将下载完整的文件,然后将其写入客户端,这不是我想要做的.有什么想法吗??

java web-services scalability jersey nonblocking

10
推荐指数
1
解决办法
771
查看次数

使用 Kodling 协程处理阻塞代码的正确方法

假设我由于某些第三方库而具有阻塞功能。沿着这些思路:


fun useTheLibrary(arg: String): String {
   val result = BlockingLibrary.doSomething(arg)
   return result
}
Run Code Online (Sandbox Code Playgroud)

对 的调用BlockingLibrary.doSomething应该在单独的ThreadPoolExecutor.

使用 kotlin 实现这一目标的正确方法是什么(假设有一种方法)?

注意:我已经读过这篇文章,但似乎已经过时了

nonblocking blocking kotlin kotlin-coroutines

10
推荐指数
1
解决办法
2972
查看次数