2

我正在运行一个多线程守护程序,其中一个 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 吗?

4

2 回答 2

1

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

如果您真的想要线程,您可以选择打开多少连接,或者等待打开的连接以便您可以使用它。

于 2012-08-28T21:05:04.823 回答
1

恢复到 Mechanize 1.0.0,这解决了问题。与 Mechanize 2+ 使用的 Net::HTTP::Persistent 不同,持久连接在 1.0 中以更可靠、多线程友好的方式处理。我的建议:坚持使用 Mechanize 1.0,它更可靠,错误更少,并且没有多线程代码的疯狂问题!!!嘘。

注意:与某些评论可能暗示的不同,Mechanize 1.0 确实实现了持久连接:查看源代码,或使用 Wireshark 进行验证。

于 2012-08-29T19:52:28.160 回答