我跟随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并行创建工作队列更成问题。
答案 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