require 'net/http'
require 'open-uri'
con = Array.new
File.open("img.txt", "r") do |file|
while line = file.gets
con.push(line)
end
end
name = 0
for i in con do
data = open(i){|f|f.read}
open(name.to_s + '.jpg', 'wb'){|f|f.write(data)}
name = name +1
print name
end
远程文件批量下载 Node.js & Ruby
关于 Node 这段代码最初文件写入用的
for
循环,没有把down
函数抽取出来做递归,于是每次做文件写操作时候会覆盖上一个文件,是因为 javascript 是单线程的,先执行完整个循环的同步内容之后才去执行其中的异步操作。get
函数里的匿名函数就是一个异步回调。处于闭包原则,该函数会保留 for 循环最后一次循环的i变量,才会导致只保存了一个文件。
所以写 node 时候尽可能的多用递归。
但是因为异步所以会按顺序依次下载,速度并不是很快,依次如下:
在
for
循环中如果使用自执行函数(function(i,file){})(i,con[i])
就可以那个避免上述问题。更重要的是,异步回调速度很快,因为不会产生阻塞,可以同步的下载图片,所以最终我选择的代码如下:
Ruby 版本
最近看了点 Ruby 的代码,实现相同功能只需要17行,简单暴力
还没有研究 Ruby 是否可以做异步回调