ruby - 如何在 ruby​​ 中处理文件时同时运行多个线程?

标签 ruby windows multithreading

今天我一直在摆弄 Ruby 和线程。我有一个要检查的代理列表。假设超时 10 秒,如果我编写如下内容,则遍历一个非常大的代理列表将花费几个小时:

  proxies.each do |proxy|
   check_proxy(proxy)
  end

我尝试找出线程的第一个问题是如何在同一时间启动多个线程。我在网上找到了一段简洁的代码片段:

for page in pages
  threads << Thread.new(page) { |myPage|

    puts "Fetching: #{myPage}\n"
    doc = Hpricot(open(myPage.to_s)).to_s
    puts "Got #{myPage}:  #{doc.size}"
  }
end

就同时启动它们而言,似乎工作得很好。那么现在我可以...开始同时检查所有 7000 条记录?

如何转到一个文件,为每个线程取出一行,运行一批(例如 20 个)并重复该过程?

我可以运行一个 while 循环,同时启动 20 个线程(从文件中删除行)并继续运行直到文件为空吗?

我对自己应该做的事情的逻辑有点弱。

谢谢大家!

PS。

另一个想法:如果 20 个工作人员不断随意乱搞,会不会出现文件访问问题?如果是这样的话,有什么好的解决办法吗?

最佳答案

您要查找的关键字是threadpool 。您可以尝试为 Ruby 找到一个(我确信 Github 上至少有几个),或者自己开发一个。

Here's这里有一个简单的实现。

回复:文件访问,IMO 你不应该让工作人员直接更改文件,而应该在主线程中进行。您不想允许同时编辑。

关于ruby - 如何在 ruby​​ 中处理文件时同时运行多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8307174/

相关文章:

c# - 当线程已经终止(.NET 5/Core)时,Thread.Join 方法并不总是返回相同的值

ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别

ruby-on-rails - 隐藏 Rails 模型属性

c++ - 我应该如何去阅读一个大的二进制文件

java - 无法在 RejectionHandler 中获取 CallableThread

c++ - 线程执行的顺序是什么?

ruby - 按小时将事件列表压缩到容器中,包括 "blank"个容器(Ruby)

ruby - 如何设置变量除以四舍五入到小数点后 0 位?

java - 使用 Windows 操作系统、Java、Selenium、Jenkins 从 Dockerfile 构建 docker 容器

c++ - EnumPrinters 示例的链接器问题