GNU Parallel作为具有命名管道的作业队列

时间:2018-10-23 09:25:09

标签: php bash named-pipes gnu-parallel

我跟随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

我可以使用命名管道作为并行输入,而我当前的设置仍然可以作为简单队列工作?

我想这样我就不必从管道中删除已完成的行,因为在读取时会自动删除这些行?

P.S。我知道并且我使用过RabbitMQ,ZeroMQ(而且我很喜欢),nng,nanomsg,甚至php pcntl_fork以及pthreads。因此,这不是什么要进行并行处理的问题。用gnu并行创建工作队列更成问题。

1 个答案:

答案 0 :(得分:0)

while read LINE; do echo $LINE >> jobqueue; done < input_data_file.txt 

这可以更快地完成:

cat >> jobqueue < input_data_file.txt 

fifo可能会起作用,但会阻塞。这意味着您不能在队列中放很多东西,这会破坏队列的目的。

如果磁盘I / O成为读取实际作业的问题,我会感到惊讶:GNU Parallel每秒可以运行100-1000个作业。作业最多可以为128 KB,因此最多您的磁盘必须提供128 MB / 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