2010-02-20
■[Gearman][AmazonS3][Ruby]AmazonS3に並列アップロード
http://d.hatena.ne.jp/shokai/20100220/1266646461 をgearmanで並列化した
upload-worker.rb
#!/usr/bin/env ruby require 'rubygems' require 'gearman' require 'aws/s3' BUCKET = "your-bucket-name" GEAR_TASK = 'upload-awss3' if ARGV.size > 0 (ARGV.first.to_i-1).times do pid = fork break if !pid puts "fork pid:#{pid}" end end AWS::S3::Base.establish_connection!(:access_key_id => "your-key", :secret_access_key => "your-secret") #Gearman::Util.debug = true w = Gearman::Worker.new(['localhost:7003']) w.add_ability(GEAR_TASK){|query, job| prefix, name = query.split(/,/) filename = name.split(/\//).last begin print "upload #{name} ... " AWS::S3::S3Object.store("/#{prefix}/"+filename, open(name), BUCKET, :access => :public_read) rescue AWS::S3::ResponseError => error puts error else puts "success => http://#{BUCKET}.s3.amazonaws.com/#{prefix}/#{filename}" end "http://#{BUCKET}.s3.amazonaws.com/#{prefix}/#{filename}" } loop do w.work end
jobはカンマ区切りで"prefix,filename"で渡す。
workerを複数起動させておいてからclientでtask登録する。
ruby upload-worker.rb 5
5つ起動した
fork pid:89264 fork pid:89265 fork pid:89266 fork pid:89267
upload-client.rb
#!/usr/bin/env ruby require 'rubygems' require 'gearman' GEAR_TASK = 'upload-awss3' c = Gearman::Client.new(['localhost:7003']) taskset = Gearman::TaskSet.new(c) now = Time.now ARGV.sort{|a,b|a.split(/\//).last.to_i <=> b.split(/\//).last.to_i}.each{|name| query = "#{now.to_i},#{name}" puts "add task #{query}" task = Gearman::Task.new(GEAR_TASK, query) task.on_complete{|res| puts "#{name} => #{res}" } taskset.add_task(task) } taskset.wait(ARGV.size*5) puts "finished #{ARGV.size} files #{Time.now-now} (sec)"
トラックバック - http://d.hatena.ne.jp/shokai/20100220/1266651243
リンク元
- 103 http://pipes.yahoo.com/pipes/pipe.info?_id=tDfBdGWF3RGl9XNm1L3fcQ
- 32 http://pipes.yahoo.com/pipes/pipe.info?_id=faa858a20082ef6d25ad27557e37e011
- 23 http://b.hatena.ne.jp/
- 17 http://reader.livedoor.com/reader/
- 14 http://b.hatena.ne.jp/hotentry/it
- 14 http://pipes.yahoo.com/pipes/pipe.info?_id=12e453e301454b799b3ac6642aa089b5
- 14 http://shokai.org/blog/archives/4141
- 8 http://www.google.com/reader/view/
- 7 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLL_jaJP349JP349&q=FT232RL USBシリアル変換
- 6 http://b.hatena.ne.jp/entrylist/it
