加速Ruby代码以实现更快/更多的API调用

时间:2014-02-20 14:25:49

标签: ruby-on-rails ruby api

我有以下代码:

list_entities = [{:phone => '0000000000', :name => 'Test', :"@i:type => '1'},{:phone => '1111111111', :name => 'Demo', :"@i:type => '1'}]

list_entities.each do |list_entity|
          phone_contact = PhoneContact.create(list_entity.except(:"@i:type"))
          add_record_response = api.add_record_to_list(phone_contact, "API Test")

          if add_record_response[:add_record_to_list_response][:return][:list_records_inserted] != '0'
            phone_contact.update(:loaded_at => Time.now)
          end

        end

此代码采用一系列哈希值并为每个哈希值创建一个新的phone_contact。然后它进行api调用(add_record_response)以对phone_contact执行某些操作。如果该api调用成功,则会更新该特定loaded_at的{​​{1}}属性。然后它开始循环。

我可以通过这项服务每小时拨打7200次api电话 - 但是,我现在每4秒钟只能拨打1次api电话。

有关如何加速此代码阻止以更快地进行api调用的任何想法?

1 个答案:

答案 0 :(得分:0)

我建议使用线程池。您可以定义要完成的工作单元以及要处理工作的线程数。这样,您可以解决等待服务器响应每个请求的瓶颈。也许尝试类似的东西(免责声明:这是改编自http://burgestrand.se/code/ruby-thread-pool/

require 'thread'

class Pool
  def initialize(size)
    @size = size
    @jobs = Queue.new

    @pool = Array.new(@size) do |i|
      Thread.new do
        Thread.current[:id] = i

        catch(:exit) do
          loop do
            job, args = @jobs.pop
            job.call(*args)
          end
        end
      end
    end
  end

  def schedule(*args, &block)
    @jobs << [block, args]
  end

  def shutdown
    @size.times do
      schedule { throw :exit }
    end

    @pool.map(&:join)
  end
end


p = Pool.new(4)

list_entries.do |list_entry|
  p.schedule do
    phone_contact = PhoneContact.create(list_entity.except(:"@i:type"))
    add_record_response = api.add_record_to_list(phone_contact, "API Test")

    if add_record_response[:add_record_to_list_response][:return][:list_records_inserted] != '0'
      phone_contact.update(:loaded_at => Time.now)
    end

    puts "Job #{i} finished by thread #{Thread.current[:id]}"
  end
  at_exit { p.shutdown }
end