每次在大循环中调用新线程

时间:2017-12-11 09:34:22

标签: ruby-on-rails ruby multithreading

我有20,000到30,000个用户,他们应该在给定时间收到消息。 SendMessage是针对第三方网站进行API调用的服务。我有这个循环:

@users.each do |user|
  ...
  SendMessage.new(user.id)
  ...
end

由于用户数量非常多,API响应大约需要一秒钟,而最后一个用户收到的消息要晚于预定时间。

我想过像这样使用Thread

@users.each do |user|
  ...
  Thread.new{ SendMessage.new(user.id) }
  ...
end

我可以这样做吗?在循环中使用Thread.new 20,000次是个好主意吗?有什么缺点吗?还有别的我应该做的吗?

2 个答案:

答案 0 :(得分:0)

考虑到您需要向第三方提供商发送20,000个API调用,并假设可以将其视为异步,您应该使用SidekiqResque实现此操作。

您最初可以发出请求,然后在需要时连续轮询状态更新。

答案 1 :(得分:0)

我还不能发表评论。但如果我的答案没有用,我会毁掉它。 因此,如果您使用each,所有记录都将被加载到内存中,当您有更多的20 000条记录时,这不是一个好主意。 尝试使用find_each。查找由批量大小为1000的find_in_batches执行(或者由:batch_size选项指定)。