2009-04-04 50 views
4

私は、米国とEUの両方のサーバーにアクセスするWebスパイダーを作成しました。米国とEUのサーバーは同じデータ構造ですが、その内部に異なるデータがあります。すべてを照合したいと思います。サーバーに親切にするために、各要求の間に待機時間があります。プログラムはまったく同じで、処理を高速化するために、私はプログラムをスレッド化して、EUと米国のサーバーに同時にアクセスできるようにしました。自己修復Pythonスレッド

このクロールは、日数ではなく週単位で行われます。例外がありますが、プログラム内のすべてを処理しようとしている間に、変なことが起こる可能性があります。本当にこれについて守るために、私は失敗したスレッドを捕まえてエラーを記録して再起動したいと思います。最悪のケース私は何千ものページを失います。これは、スレッドが失敗してスピードが50%低下するよりも優れています。しかし、私が読んだことから、Pythonスレッドは静かに死ぬ。誰にもアイデアはありますか?

class AccessServer(threading.Thread): 
    def __init__(self, site): 
     threading.Thread.__init__(self) 
     self.site = site 
     self.qm = QueueManager.QueueManager(site) 

    def run(self): 
     # Do stuff here 


def main(): 
    us_thread = AccessServer(u"us") 
    us_thread.start() 

    eu_thread = AccessServer(u"eu") 
    eu_thread.start() 

答えて

8

ちょうどrun方法でtry: ... except: ...ブロックを使用して参照してください。スレッドが失敗するような変わったことが起こった場合は、コード内のどこかにエラーがスローされる可能性が高くなります(スレッディング・サブシステム自体ではなく)。この方法でそれを捕まえてログに記録し、スレッドを再起動することができます。実際にスレッドをシャットダウンして新しいスレッドを開始するかどうかにかかわらず、try/exceptブロックをwhileループ内に囲んで、同じスレッドが実行し続けるようにしてください。

もう一つの解決策は、Pythonのエラー処理メカニズムで検出できない本当に奇妙なことが起こったと思われる場合、定期的に他のスレッドが正常に動作しているかどうかを確認するモニタスレッドを開始することです。

+0

'try:except:'を 'run'メソッドで囲むことは考えていませんでした。ありがとう! – cflewis

3

監視スレッドとしてのメインスレッドの機能?例えば。ワーカースレッドが定期的にスレッド固有のタイムスタンプ値を更新し、スレッドが適切な時間内にタイムスタンプを更新していない場合は、監視スレッドがそれを強制終了して再起動するように要求しますか?

あるいは、this answer

+0

これはいい考えです。あなたが指摘したスレッドは素晴らしいです。ご協力いただきありがとうございます! – cflewis

関連する問題