从Linux上的命令队列进行并行处理(bash,python,ruby ......等等)

mla*_*bie 44 ruby python parallel-processing bash shell

我有一个200个命令的列表/队列,我需要在Linux服务器上的shell中运行.

我只希望一次最多运行10个进程(从队列中).某些流程需要几秒钟才能完成,其他流程需要更长时间.

当进程完成时,我希望从队列中"弹出"下一个命令并执行.

有没有人有代码来解决这个问题?

进一步阐述:

在某种队列中需要完成200件工作.我希望一次最多可以完成10件工作.当一个线程完成一项工作时,它应该要求队列进行下一项工作.如果队列中没有其他工作,则线程应该死掉.当所有线程都已经死亡时,意味着所有工作都已完成.

我正在尝试解决的实际问题是使用imapsync将旧邮件服务器中的200个邮箱同步到新邮件服务器.某些用户拥有大型邮箱并需要很长时间才能同步,其他用户拥有非常小的邮箱并可以快速同步.

Joh*_*itb 44

在shell上,xargs可以用来排队并行命令处理.例如,因为总是有3个并行睡眠,每个睡眠1秒,并且总共执行10次睡眠

echo {1..10} | xargs -d ' ' -n1 -P3 sh -c 'sleep 1s' _
Run Code Online (Sandbox Code Playgroud)

它总共会睡4秒钟.如果你有一个名字列表,并希望将名称传递给执行的命令,再次并行执行3个命令,那么

cat names | xargs -n1 -P3 process_name
Run Code Online (Sandbox Code Playgroud)

会执行命令process_name alice,process_name bob依此类推.


Erg*_*Sum 40

我想你可以使用make和make -j xx命令来做到这一点.

也许像这样的makefile

all : usera userb userc....

usera:
       imapsync usera
userb:
       imapsync userb
....
Run Code Online (Sandbox Code Playgroud)

make -j 10 -f makefile

  • @redmoskito如果使用"-k"选项运行make,即使存在错误,它也会继续运行. (5认同)

小智 26

为此目的,并行地进行了平行.

cat userlist | parallel imapsync
Run Code Online (Sandbox Code Playgroud)

与其他解决方案相比,Parallel的优点之一是确保输出不会混合.这样做traceroute并行例如正常工作:

(echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute
Run Code Online (Sandbox Code Playgroud)


小智 13

对于这种工作PPSS编写:并行处理shell脚本.谷歌的这个名字,你会发现它,我不会链接垃圾邮件.


Ign*_*ams 7

GNU make(也许还有其他实现)有-j参数,它控制一次运行多少个作业.当一个工作完成时,make将启动另一个工作.