3

端末で数時間実行されている web クローリング python スクリプトがあり、データベースに継続的にデータが入力されています。ネストされた for ループがいくつかあります。何らかの理由で、コンピューターを再起動し、元の場所からスクリプトを続行する必要があります。ポインターの状態を保持し、以前に実行していたスクリプトをターミナルで再開することはできますか?

Pythonスクリプトを変更せずに機能するソリューションを探しています。コードを変更することは、プログラムを再起動して時間を再投資することを意味するため、優先度は低くなります。

更新: VM の提案に感謝します。私はそれを取ります。完了するために、スクリプトを一時停止および再開できるようにするには、スクリプトにどのような一般的な変更を加える必要がありますか?

Update2 : VM への移植は正常に機能します。また、ネットワーク障害に対してフェールセーフになるようにスクリプトを変更しました。以下に書かれたコード。

4

6 に答える 6

4

コンピューターをサスペンドするか、後でサスペンドできる仮想マシンで実行してみてください。ただし、スクリプトはネットワーク接続で動作しているため、システムを立ち上げた時点からスクリプトが動作しなくなる可能性があります。コンピューターを一時停止して復元するか、仮想 M/C を保存して復元すると、ネットワーク接続を再確立する必要があります。これは、システムの外部にあるすべての要素に当てはまり、ネットワークはその 1 つです。また、動的ネットワークを使用している場合、次回の起動時に新しい IP が取得され、以前に機能していたネットワーク状態が無効になる可能性が高くなります。

スクリプトの変更を計画している場合、覚えておく必要があることはほとんどありません。

  1. シリアライズおよびデシリアライズ機能を追加します。Python には pickle と、より高速な cPickle メソッドがあります。
  2. 再起動ポイントを追加します。これを行う最善の方法は、定期的に状態を保存し、スクリプトを再起動するときに、ネットワークなどのすべてのトランジェント要素を確立した後、最後に保存した状態から再起動することです。

これは簡単な作業ではないので、かなりの時間を投資することを検討してください:-)

ノート***

もう一度考えてみてください。スクリプトを変更する方法が 1 つあります。Amazon EC2 などのクラウド仮想化ソリューションを試すことができます。

于 2011-12-25T17:28:05.967 に答える
2

スクリプトを VM に移植し、そこから起動しました。ただし、休止状態から再開した後、ネットワーク接続の不具合が発生しました。Pythonスクリプトを微調整して解決した方法は次のとおりです。

import logging
import socket
import time
socket.setdefaulttimeout(30) #set timeout in secs
maxretry = 10  #set max retries
sleeptime_between_retry = 1 #waiting time between retries

erroroccured = 0
while True:
    try:
        domroot = parse(urllib2.urlopen(myurl)).getroot()
    except Exception as e:
        erroroccured += 1
        if erroroccured>maxretry:
            logger.info("Maximum retries reached. Quitting this leg.")
            break
        time.sleep(sleeptime_between_retry)
        logging.info("Network error occurred. Retrying %d time..."%(erroroccured))
        continue
    finally:
        #common code to execute after try or except block, if any
        pass
    break

この変更により、私のスクリプトはネットワーク障害に対する耐性が強化されました。

于 2011-12-26T14:10:11.460 に答える
1

他の人がコメントしているように、一時停止できる仮想マシンでスクリプトを実行していない限り、スクリプトを変更してその状態を追跡する必要があります。

于 2011-12-25T17:18:27.410 に答える
1

データベースにデータを入力しているので、スクリプトの進行状況を追跡する方法として使用することをお勧めします (解析された最新の URL を取得する、保留中の URL のリストを取得するなど)。

スクリプトが突然終了した場合、データベース トランザクションが助けになり、コミットしたデータのみが保存されるため、スクリプトの状態を保存することを心配する必要はありません。

スクリプトを再起動すると、処理が完了した URL のデータのみが保存され、データベースに従って次の URL を取得するだけで再開できます。

于 2011-12-25T19:10:56.307 に答える
0

この問題が、この種の金銭的投資を保証するほど重要である場合は、仮想マシンでスクリプトを実行できます。シャットダウンする必要がある場合は、仮想マシンをサスペンドしてから、コンピューターをシャットダウンします。再起動する場合は、コンピューターを起動してから、仮想マシンをウェイクアップします。

于 2011-12-25T17:19:51.403 に答える
0

WinPDBは、リモート デバッグをサポートする Python デバッガーです。私はそれを使用したことがなく、実行中のプロセスをリモートでデバッグするためにスクリプトを変更する必要があるかどうかもわかりません (そうでない場合はセキュリティの問題になる可能性が非常に高いです)。ただし、スクリプトを変更せずにリモート デバッグが可能な場合は、スクリプトの現在の状態をファイルにダンプし、後でそれをロードする方法を見つけることができます。私はそれがうまくいくとは思わない。

于 2011-12-25T17:30:33.117 に答える