我需要a HashMap或simpy a Map,其中固定数量的元素(n)像FIFO队列一样工作.
因此,在元素编号<= n之前,新元素只需放入地图中.
对于元素编号> n,将删除第一个插入的元素,并将最新的元素放入地图中.
Java中有类似的东西,还是我必须实现它?
情况:
new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO
data = os.read(new_pipe, 1024)
Run Code Online (Sandbox Code Playgroud)
读取偶尔会引发错误-11:资源暂时不可用.
什么时候出现这个错误?这似乎非常罕见,因为常见情况返回数据:
LinkedHashMap是LIFO还是FIFO的性质?如果我的地图是形式 - >
map.put(1,"one");
map.put(2,"two");
Run Code Online (Sandbox Code Playgroud)
如果我要使用keyset在地图上迭代,那将是什么命令?
编辑:我认为我确实混淆了两个不同的概念.我重新解释了这个问题.我使用entryset遇到数量的顺序是什么?感谢指出btw.i donot打算删除任何条目.
我需要使用node.js实时读出正在写入文件的数据的最佳方法.麻烦的是,Node是一艘快速发展的船,它使寻找解决问题的最佳方法变得困难.
我想做什么
我有一个正在做某事的java进程,然后把它做的事情的结果写到文本文件中.它通常需要5分钟到5个小时才能运行,数据写入的时间很长,并且可以达到一些相当高的吞吐率(大约1000线/秒).
我想实时读取这个文件,然后使用节点聚合数据并将其写入套接字,在套接字上可以在客户端上绘制图形.
客户端,图形,套接字和聚合逻辑都已完成,但我对阅读文件的最佳方法感到困惑.
我尝试过(或者至少玩过)
FIFO - 我可以告诉我的Java进程写一个fifo并使用node读取它,这实际上是我们如何使用Perl实现这个目的,但是因为其他一切都在节点中运行将代码移植过来是有意义的.
Unix Sockets - 如上.
fs.watchFile - 这会对我们需要的东西起作用吗?
fs.createReadStream - 这比watchFile好吗?
fs&tail -f- 似乎是一个黑客.
实际上,我的问题是什么,
我倾向于使用Unix套接字,这似乎是最快的选择.但节点是否具有更好的内置功能,可以实时读取fs中的文件?
我有一个封闭的源程序,打印输出到标准输出.我需要解析输出.所以我使用dup2将输出重定向到fifo(我可以在父进程中读取,分叉和执行二进制文件),然后执行程序.问题是文件中的fprintf调用变为缓冲,因为它现在正在写入文件.
我试着在调用exec之前在stdout上用_IONBF调用setvbuf.但问题仍然存在.
为什么setvbuf在我的情况下没有帮助?
我如何强制输出刷新?
是否存在" 无锁FIFO队列的optmistic方法"算法的 C++实现(源代码)?
有没有办法在shell中创建非阻塞/异步命名管道或类似的东西?所以程序可以在其中放置行,这些行将保留在ram中,并且当某个程序可以从管道读取一些行时,同时留下它没有在fifo中读取的内容?程序也很可能同时写入和读取这个fifo.起初我可能这可能是使用文件来完成的,但是在搜索了一下web之后,似乎没有什么好处可以来自同时读取和写入文件的事实.命名管道几乎可以工作,只有两个问题:首先,如果在另一端没有人阻止读/写,第二,即使我让写入被阻止并设置两个进程写入管道而没有人正在读取,通过尝试为每个进程写一行,然后尝试head -n 1 <fifo>我只需要一行,但两个写入进程终止,第二行丢失.有什么建议?
编辑:也许一些中间程序可以用来帮助解决这个问题,就像作家和读者之间的中介一样?
在Java doc中:
[...]例外的是优先级队列,它根据提供的比较器对元素进行排序,或者元素的自然排序,以及对LIFO元素进行排序的LIFO队列(或堆栈)(后进先出)
如何实现java.util.queue使用LIFO而不是FIFO?
在BASH脚本中,我们可以在后台运行多个进程,这些进程使用命名管道进行互通,在文件系统上注册FIFO.这方面的一个例子可能是:
#!/bin/bash
mkfifo FIFO
# BG process 1
while :; do echo x; done & >FIFO
# BG process 2
while :; do read; done & <FIFO
exit
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以在不使用文件系统上的FIFO的情况下在脚本的后台进程之间进行相同的相互通信,也许可以使用某种文件描述符重定向.
我想要一个类似于Array.pop()的Array方法,它表现出先入先出行为,而不是本机FILO行为.有一个简单的方法吗?
想象一下javascript控制台:
>> array = [];
>> array.push(1);
>> array.push(2);
>> array.push(3);
>> array.fifopop();
1 <-- array.pop() yields 3, instead
Run Code Online (Sandbox Code Playgroud) fifo ×10
java ×3
linux ×3
queue ×3
collections ×2
javascript ×2
arrays ×1
bash ×1
c ×1
c++ ×1
lock-free ×1
map ×1
mkfifo ×1
named-pipes ×1
node.js ×1
nonblocking ×1
pipe ×1
python ×1
real-time ×1
shell ×1
stdio ×1
unix-socket ×1