2

私はマルチスレッドデーモンを実行しており、ruby Mechanizeのインスタンス(Net :: HTTP :: Persistentオブジェクトを含む)が多くのスレッドの1つによって使用および実行される可能性があります。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に戻り、問題は解決しました。Mechanize2+が使用するNet::HTTP :: Persistentとは異なり、1.0では永続的な接続がより信頼性が高くマルチスレッドに適した方法で処理されます。私のアドバイス:Mechanize 1.0を使い続けると、信頼性が高くなり、エラーが少なくなり、マルチスレッドコードでクレイジーな問題が発生しません!!! シーシュ。

注:一部のコメントとは異なり、Mechanize 1.0は持続的接続を実装しています。ソースコードを確認するか、Wiresharkで確認してください。

于 2012-08-29T19:52:28.160 に答える