首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GNU并行作为具有命名管道的作业队列

GNU并行作为具有命名管道的作业队列
EN

Stack Overflow用户
提问于 2018-10-23 17:25:09
回答 1查看 238关注 0票数 1

我遵循sample code创建了一个gnu并行作业队列,如下所示

代码语言:javascript
复制
// 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中添加一个脚本,以便在作业完成时从作业队列中实际删除该行,但我觉得有更好的方法来做到这一点。

有没有可能不使用

代码语言:javascript
复制
tail -f jobqueue

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

我猜这样我就不必从管道中删除行了,因为它将在读取时自动删除?

附注:我知道并且我已经使用过RabbitMQ,ZeroMQ (我喜欢它),nng,nanomsg,甚至php pcntl_fork以及pthread。因此,这不是并行处理有什么的问题。使用gnu并行创建工作队列更是一个问题。

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 03:32:08

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

这可以更快地完成:

代码语言:javascript
复制
cat >> jobqueue < input_data_file.txt 

虽然fifo可能会起作用,但它会阻塞。这意味着你不能在队列中放很多东西--这有点违背了队列的目的。

如果磁盘I/O是读取实际作业的问题,我会感到惊讶: GNU并行每秒可以运行100-1000个作业。作业最多可以是128KB,所以你的磁盘最多只能传输128MB/s。如果你不是每秒运行100个作业,那么队列的磁盘I/O永远不会是问题。

如果重新启动,则可以使用--resume --joblog mylog跳过已经运行的作业:

代码语言:javascript
复制
# Initialize queue
true >jobqueue
# (Re)start running the queue 
tail -n+0 -f jobqueue | parallel --resume --joblog mylog
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52945578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档