gpt4 book ai didi

Ruby 一次只创建 3 个线程

转载 作者:数据小太阳 更新时间:2023-10-29 07:06:00 25 4
gpt4 key购买 nike

我正在尝试运行 500 个客户端同时向服务器发送一些请求以进行负载测试。客户端又是一个 ruby​​ 程序。听起来微不足道。但是我遇到了 ruby​​ 线程的奇怪问题。我的代码看起来像这样 -

n = 10

n.times do
Thread.new do
`calc`
end
end

代码是示例。我只是想从命令行运行 calc 命令(如果您在 Windows 以外的平台上尝试此代码,请将其替换为在您的命令行或 shell 上运行的一些命令)。稍后将替换为“ruby my_client.rb”,并且 n 的值将设置为 500(或其他值)。

我在这里面临的问题是,无论我想创建多少个线程,一次只能创建 3 个线程。也就是说只有 3 个计算窗口同时打开。其余线程只是在队列中等待这 3 个线程的终止。可能与阻塞和非阻塞调用有关。但我尝试了相同程序的 Java 等价物,它运行得很好。不推荐使用 ruby​​ 中的线程是一句老话。这是 Ruby 线程的问题还是我做错了什么?

最佳答案

您观察到的问题是 GUI 应用程序特有的。当您在 worker 中运行命令行时,它会变得更好。

通过下面的示例,我可以很好地运行 200 个 wget 实例,这可能足以满足您的负载测试目标。

n = 200

threads = []
(1..n).each do |i|
threads << Thread.new do
puts `wget google.com` # forgive me google
sleep 10
puts "#{i} done"
end
end

threads.each do |t| # wait until all workers are done
t.join
end

如果您从 wget 切换到 Ruby 代码来获取网页,您可能会得到更多的工作人员。而且,您应该记住,Ruby 线程只能扩展到那么远。不要指望数千个线程或并行线程能够正常工作——请尝试使用子流程或基于延续的方法。

关于Ruby 一次只创建 3 个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/548465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com