我遵循sample code创建了一个gnu并行作业队列,如下所示
// create a job queue file
touch jobqueue
//start the job queue
tail -f jobqueue | parallel -u php worker.php
// in another shell, add the data
while read LINE; do echo $LINE >> jobqueue; done < input_data_file.txt
这种方法确实有效,并将作业作为一个简单的作业队列来处理。但是有两个问题
1-从输入文件读取数据,然后将其写入作业队列(另一个文件)的速度很慢,因为这涉及到磁盘I/O。
2-如果由于某种原因,我的作业在中途中止,并且我重新启动了并行处理,它将重新运行作业队列文件中的所有作业
我可以在worker.php中添加一个脚本,以便在作业完成时从作业队列中实际删除该行,但我觉得有更好的方法来做到这一点。
有没有可能不使用
tail -f jobqueue
我可以使用命名管道作为并行的输入,而我当前的设置仍然可以作为一个简单的队列工作?
我猜这样我就不必从管道中删除行了,因为它将在读取时自动删除?
附注:我知道并且我已经使用过RabbitMQ,ZeroMQ (我喜欢它),nng,nanomsg,甚至php pcntl_fork以及pthread。因此,这不是并行处理有什么的问题。使用gnu并行创建工作队列更是一个问题。
发布于 2018-10-24 03:32:08
while read LINE;do echo $LINE >> jobqueue;done < input_data_file.txt
这可以更快地完成:
cat >> jobqueue < input_data_file.txt
虽然fifo可能会起作用,但它会阻塞。这意味着你不能在队列中放很多东西--这有点违背了队列的目的。
如果磁盘I/O是读取实际作业的问题,我会感到惊讶: GNU并行每秒可以运行100-1000个作业。作业最多可以是128KB,所以你的磁盘最多只能传输128MB/s。如果你不是每秒运行100个作业,那么队列的磁盘I/O永远不会是问题。
如果重新启动,则可以使用--resume --joblog mylog
跳过已经运行的作业:
# Initialize queue
true >jobqueue
# (Re)start running the queue
tail -n+0 -f jobqueue | parallel --resume --joblog mylog
https://stackoverflow.com/questions/52945578
复制相似问题