ruby - 重用 Ruby 中线程之间的连接/替换 Net::HTTP::Persistent

标签 ruby multithreading thread-safety net-http

我正在运行一个多线程守护程序,其中 ruby​​ Mechanize 的实例(包含 Net::HTTP::Persistent 对象)可能由多个线程之一使用和运行。我遇到了很多问题,因为 Net::HTTP::Persistent 为运行它的每个线程打开一个新连接,所以如果我有 50 个线程,我最终打开的连接数是它的 50 倍我需要!我尝试过对 Net::HTTP::Persistent 进行子类化和修补,以将其连接信息存储为其类的一部分,而不是存储在 Thread.current 中,但随后我不断收到

too many connection resets (due to Broken pipe - Errno::EPIPE)

到处都是..有什么想法吗?有人知道我可以使用 Net::HTTP::Persistant 的替代库,并希望可以轻松地修补 Mechanize 吗?

最佳答案

问题是,如果您从另一个线程访问 Net::HTTP::Persistent 对象,并且该对象位于某个对象的中间,则该线程要么必须阻塞(停止执行)并等待该对象执行其需要的操作),或者创建一个新对象并对其进行处理。使用线程,您可能处于(请原谅,我在这里做出假设)HTTP 请求的中间,突然,另一个线程想要使用相同的连接创建 HTTP 请求,这会破坏一切(可能是为什么您遇到了连接重置问题)。

如果您确实需要线程,您的选择是打开任意数量的连接,或者等待打开的连接以便您可以使用它。

关于ruby - 重用 Ruby 中线程之间的连接/替换 Net::HTTP::Persistent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167445/

相关文章:

ruby - 如何让用户输入并检查数组中的项目?

android防弹toast方法

c - PortAudio 回调,并在别处更改变量

file-io - WriteFile线程安全

python - 具有异步任务和redis的django中的线程安全

ruby - 有没有好的 ruby​​ 线路分析器?

ruby - 使用自定义环境运行命令行

ruby-on-rails - 在 Windows、CentOS 和 Mint 上安装 Ruby on Rails 时出错

java - "local variables are thread safe"有条件吗?

multithreading - 内核线程 native 线程os线程