2012-04-11 7 views
2

これまでにこの質問が尋ねられたが、見つからなかったと確信している。既存のプロセスが存在するかどうかを確認する - それがあればそれと通信する、そうでない場合は新しいものを作成する

私は、ディレクトリを与えられたPythonプログラムを書いています。これは非常に単純なヒューリスティックを使って、その内容とどのターゲットディレクトリを "解凍"するかを決定します。

このプログラムは、新しいダウンロードが完了するたびに実行されます。ダウンロードが大量に完了した場合、私は同時にたくさんの処理を取得します。私はこの問題を、一度に1つのディレクトリだけを解凍するようにプログラムの大部分を書き直すことによって修正したいと思います。

これを達成するために、現在実行中のプログラムのPIDを含む「ロック/ PID」ファイルを使用すると思いました。ロック/ PIDファイルが存在する場合、新しく生成されたプロセスは、("queue", "D:/some/directory")の行に沿って何かを既存のプロセスに送信し、そのプロセスが現在のアンパックで完了したときにそのターゲットをアンパックする必要があります。

これをPythonでどうすれば達成できますか?これはWindowsシステム上で動作する必要がありますが、GNU/Linuxでも理想的です。

+0

ダウンロードが完了したときに実行されるプログラム、つまりPythonスクリプト、またはスクリプトが実行するものを待ちますか?あなたは新しいプロセスをどのように始めることを手配しますか? –

+0

ダウンロードが完了すると、私のPythonプログラムが実行されます。唯一の引数は、ダウンロードされたディレクトリへのパスです。 – damd

+0

ダウンロードが完了したら、あなたのPythonプログラムを実行させる原因は何ですか? –

答えて

0

あなたはちょうどあなたが使用することができ、PIDファイルが存在するかどうかを確認したい場合:os.path

os.path.exists(path) 
0

だから、あなたはすでにlockfile by Ben Finney

例のようなものを使用しているので、:

from lockfile.pidlockfile import PIDLockFile 
lock = PIDLockFile('somefile') 
lock.acquire(timeout=3600) 
#do stuff 
lock.release() 

実行中のデーモンと通信したい場合は、デーモンにソケットを聞かせて、生成されたプロセスからデータをソケット。 (UDPソケットをf.ex)

ので、デーモンに:クライアント上

import socket 
import traceback 
import Queue 
import threading 
import sys 

hostname = 'localhost' 
port = 12368 
#your lockfile magick here 
# if you want one script to run each time, put client code here instead of seperate script 
#if already running somehwere: 
    #message = "hello" 
    #sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    #sock.sendto(message, (hostname, port)) 
    #sys.exit(0) 

que = Queue.Queue(0) 

socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
socket_.bind((hostname, port)) 

class MyThread(threading.Thread): 
    def run(self): 
     while True: #maybe add some timeout here, so this process closes after a while 
        # but only stop if que.empty() 
      message = que.get() 
      print "handling message: %s" % message 
      #handle message 

t = MyThread() 
t.start() 

while True: 
     try: 
      #blocking call 
      message, _ = socket_.recvfrom(8192) #buffer size 
      print "received message: %s" % message 
      #queue message 
      que.put(message) 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      traceback.print_exc() 

:あなたはすべて実行している場合

import socket 
hostname = 'localhost' 
port = 12368 
message = "hello" 
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.sendto(message, (hostname, port)) 

あなたは、ホスト名のための 'ローカルホスト' を使用することができますこれを同じマシンで実行します。

一方、ソケットの代わりにmultiprocess pipesを使用するのが適切な方法かもしれませんが、私はまだそれらの経験がありません。 この設定には、別のマシン上でサーバーとクライアントを実行できるという利点があります。

関連する問題