【发布时间】:2018-06-09 23:12:06
【问题描述】:
我有一个 Ruby 应用程序,它每 60 秒为每个用户获取最近的消息。由于消息托管在远程 API 上,因此这是目前最实用的方法:
while true
fetch_recent_messages do |result|
# Handle result
end
sleep 60
end
def fetch_recent_messages()
Thread.new do
sleep_duration = 60 / @fetch_users.count
for fetch_user in @fetch_users
Thread.new do
@api_manager.fetch_recent_messages_for_user(fetch_user)
yield result
end
sleep sleep_duration
end
end
end
-
fetch_recent_messages()每 60 秒调用一次。 -
@fetch_users循环通过,在每次迭代中休眠适当的时间,因此该函数需要大约 60 秒才能在所有用户中调用fetch_recent_messages_for_user()。这有助于分散网络和 CPU 负载。 -
@fetch_users循环的迭代初始化一个新线程,在该线程上执行 API 调用,然后将结果返回到while循环。
关键是每个 API 请求都会初始化一个新线程,以允许它们彼此异步发生。可能有大量用户,比如 10k,因此重要的是所有用户的获取消息请求都能够在相同的 60 秒内得到处理。这对于我的服务器上的 CPU/内存使用来说很好。
我注意到此应用的内存使用量在很长一段时间内自发地上升或下降,并且无法将其与任何特定行为相关联。这可能在以 15% 的 CPU 使用率运行 24 小时或更长时间后发生 - 它会突然跃升至 30%,然后一段时间后可能会上升到 40% 或再次下降。它似乎没有模式。除了创建新线程以观察性能之外,我最终将所有内容都注释掉了,这似乎是导致内存问题的原因。
我想知道在 Ruby 中是否存在维护大量线程的问题,以及我是否应该以不同的方式处理它们,或者可能以不同的方式执行此任务。
【问题讨论】:
标签: ruby multithreading server