2011-12-10 15 views
0

サンプルコード:http POSTリクエストをPythonでハングアップするにはどうすればよいですか?

socket.setdefaulttimeout(150) 

MechBrowser = mechanize.Browser() 
Header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)'} 
Url = "http://example.com" 
Data = "Justatest=whatever&letstry=doit" 
Request = urllib2.Request(Url, Data, Header) 
Response = MechBrowser.open(Request) 
Response.close() 

私は上記のコードに何か問題があると思うが、継続的に実行しているから、スクリプト全体を防ぎすべての今して私がぶら下がってますよHTTP POSTリクエストはありません。私はすでにsocket.setdefaulttimeout(150)を使用しています。この問題の原因は何ですか?そしてこれを取り除くために私は何をすべきですか?

答えて

0

問題が見つかりました。

私は最近 requests多くを使用して timeoutあなたが mechanizerequestsの両方に設定された接続が本当に遅いですし、転送するデータがまだあるならば、それはどれが可能性、タイムアウトしないことを意味しており、 "NOT a time limit on the entire response download"であることを実現してきた

かなり長い間接続を掛けてください。

スレッドでこれらのリクエストをラップして、これらのスレッドのタイムアウトを設定すると、タイムアウトがより正確になります。これらのハング接続をクリーンアップ/ガベージコレクションで確実に確認してください。

0

は多くの理由だろう -

あなたがに投稿されているサーバがビジー状態である可能性があり、ネットワークの混雑などしかし、あなたは(あなたがContent-typeが欠落しているあなたは、完全なヘッダーを送信確認することによってあなたの端からの問題を解消することができますヘッダ)。

+1

詳細をお知らせください。 'Content-type'ヘッダーだけが追加された場合、どのような違いがありますか?つまり、 'socket.setdefaulttimeout(150)'は、タイムアウトした後、少なくともハンギング接続を閉じるべきですか?そうではありませんか?それがうまくいかない場合、ハングアップリクエストを終了するためのより良い解決策はありますか? – Shane

0

コンテンツ長のヘッダーが設定されていないためだと思います。要求がサーバーに送信されると、データは要求の本文に送信されます。 tcp接続のストリーミングベースの特性のため、あなたがヘッダに明示的に指示しない限り、サーバが要求の長さを見つける方法はありません。あなたの要求がいつ終わるかを知らずに、サーバは無期限に待たなければなりません。

あなたのソケットがrecv/send操作でブロックされていないため、timeout属性はここでは機能しません。あなたはソケットを通してデータを書いていますが、サーバーはあなたにもっと送るべきと思っています。

関連する問題