我有以下代码:
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调用的任何想法?
答案 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