2011-12-27 9 views
1

私は、urllib2 OpenerDirectorを使用してインターネットをクロールするためにPythonスパイダーを使用しています。問題は、接続が必然的にhttpsアドレスにハングすることで、明らかにタイムアウト値を無視するということです。Pythonでは、時々ハングする関数呼び出しのタイムアウトを強制できますか?

解決策の1つは、スレッドで実行し、スレッドが停止した場合にそのスレッドを強制終了して再起動することです。どうやらPythonはスレッドを殺すことをサポートしておらず、ガベージコレクションやその他の問題のために悪い考えだと思われます。しかし、この解決法は、単純さのために私にとっては好ましいものです。

もう1つのアイデアは、Twistedのような非同期ライブラリを使用することですが、問題は解決しません。

強制的に呼び出しを中断する方法、またはurllib2 OpenerDirectorがタイムアウトを処理する方法を修正する方法が必要です。ありがとう。

答えて

2

もう1つのStackOverflowの質問は、同様のhereです。私が似たようなことに直面したとき、私は何をやっていたのかを、&呼び出し関数を定義することに変換する方が簡単で、タイムアウトイベントの後に値を返すことができました。これは実際には様々な戻り値を利用することでより多くの可能性を開くことができます。

私は上記にリンクされている関連する質問へのもう一つの答えはより多くのあなたが探しているもののように聞こえる(私はそれを理解):https://stackoverflow.com/a/5817436/1118357

+0

パート2に関して、明らかに「これは実際にスレッドを停止しません」。 – 2371

+0

"定義して関数を呼び出すために私がやっていたことを変換する"ことを明確にできますか? – 2371

0

私の代わりに、スレッドの別のプロセスを使用することをお勧め。

from multiprocessing import Process 

checker = Process(target=yourFunction, args=(some_queue)) 
timeout = 150 
checker.start() 
counter = 0 
while checker.is_alive() == True: 
     time.sleep(1) 
     counter += 1 
     if counter > timeout : 
       print "Son process consumed too much run-time. Going to kill it!" 
       kill(checker.pid) 
       break 

このようにして、息子のプロセスが起こっても、150秒後にはこのように殺されます。

+0

また、この質問をチェックアウト:[リンク](http://stackoverflow.com/questions/8464391/what-should-i-do-if-socket-setdefaulttimeout-is-not-working/8654421#8654421) – WeaselFox

関連する問題