3

私は常にデータをスクレイプするPythonスクリプトに取り組んでいますが、かなり長い時間がかかります。長時間実行されているPythonスクリプトを停止する安全な方法はありますか?ループは10分以上実行されます。ループが既に実行された後、必要に応じてループを停止する方法が必要です。

cronジョブから実行する場合、終了するまで実行されると想定しているので、どうすれば停止できますか?

また、ブラウザから実行してファイルを呼び出すだけの場合。ページの読み込みを停止するとページが停止すると思いますよね?


シナリオは次のとおり
です。ページから情報を収集してキューに入れるPythonスクリプトが1つあります。次に、キュー内の新しいアイテムをチェックするだけの無限ループにある別のPythonスクリプトが必要です。無限ループを午前8時に開始し、午後8時に終了させたいとします。どうすればこれを達成できますか?

4

3 に答える 3

5

別の方法を紹介します。ある種の情報をリアルタイムで更新したいようです。pub / subインターフェース(パブリッシュ/サブスクライブ)を使用できます。Pythonを使用しているので、多くの可能性があります。

それらの1つはRedispub/ sub機能を使用していますhttp ://redis.io/topics/pubsub/-これは対応するPythonモジュールです:redis-py

-更新-

dirkk0質問/回答)の例を次に示します。

import sys
import threading

import cmd


def monitor():
    r = redis.Redis(YOURHOST, YOURPORT, YOURPASSWORD, db=0)

    channel = sys.argv[1]
    p = r.pubsub()

    p.subscribe(channel)

    print 'monitoring channel', channel
    for m in p.listen():
        print m['data']


class my_cmd(cmd.Cmd):
    """Simple command processor example."""

    def do_start(self, line):
        my_thread.start()

    def do_EOF(self, line):
        return True

if __name__ == '__main__':
    if len(sys.argv) == 1:
        print "missing argument! please provide the channel name."
    else:
        my_thread = threading.Thread(target=monitor)
        my_thread.setDaemon(True)

        my_cmd().cmdloop()

-アップデート2-

さらに、このチュートリアルを見てください。

http://blog.abourget.net/2011/3/31/new-and-hot-part-6-redis-publish-and-subscribe/

于 2012-08-10T09:18:02.450 に答える
0

この問題を回避する1つの方法は、1つのループを実行するためのスクリプトを用意することだと思います。

  1. スクリプトの他のインスタンスが実行されていないことを確認してください
  2. キューを調べて、そこで見つかったすべてを処理します

これで、午前8時から午後8時まで毎分cronからこのスクリプトを実行できます。唯一の欠点は、新しいアイテムが処理されるまでに時間がかかる可能性があることです。

于 2012-08-10T09:13:16.507 に答える
0

ブラウザページを保持してもPythonスクリプトが停止するとは限らないと思います。スクリプトは、FORKを使用して親プロセスの制御下で開始することをお勧めします。

  • 例 :

OS、時間、信号をインポートします

def child():
   print 'A new child ',  os.getpid( )
   time.sleep(5)
   os._exit(0)  

def parent():
   while True:
      newpid = os.fork()
      if newpid == 0:
         child()
      else:
         pids = (os.getpid(), newpid)
         print "parent: %d, child: %d" % pids
         print "start counting time for child process...!"
         time1 = time.clock()
         while True:
                  #time.sleep(1)
                  time2 = time.clock()
                  # Check if the execution time for child process exceeds 10 minutes... 
                  if time2-time1 >= 2 :
                           os.kill(int(newpid), signal.SIGKILL)
                           break

      if raw_input( ) == 'q': break

parent()
于 2012-08-10T10:40:35.623 に答える