2012-04-11 102 views
2

我確信之前已經詢問過這個問題,但是我找不到它。檢查現有進程是否存在 - 是否存在,與它通信,否則創建一個新進程

我已經編寫了一個Python程序,它給出一個目錄,使用一個非常簡單的啓發式來確定如何「解包」它的內容和目標目錄。

只要新下載完成,就會執行該程序。如果大部分下載都完全一樣,我會同時解開許多進程。我想通過重寫大部分程序來解決這個問題,一次只解壓一個目錄。因此,爲了達到這個目的,我想使用一個「鎖/ PID」文件,其中包含任何當前正在執行的程序的PID。如果鎖/ PID文件存在,則新產生的進程應該簡單地沿着("queue", "D:/some/directory")的行向現有進程發送一些內容,並讓該進程在完成當前解包時解壓該目標。

我該如何在Python中實現這個功能?這必須在Windows系統上運行,但最好在GNU/Linux上運行。

+0

等待,下載完成時執行什麼程序 - 您的Python腳本或腳本執行的內容?你如何安排新的過程開始? – 2012-04-11 08:37:42

+0

我的Python程序在下載完成時執行。它唯一的參數是下載目錄的路徑。 – damd 2012-04-11 08:39:02

+0

是什麼原因導致您的Python程序在下載完成時執行? – 2012-04-11 08:40:15

回答

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() 

您可能想要與正在運行的守護進程進行通信,您應該讓該守護進程偵聽某個套接字,然後從衍生進程發送數據到插座。 (f.ex UDP套接字)

所以在守護:

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)) 

的主機名,你可以使用 'localhost' 的,如果你正在運行的所有在同一臺機器上。

另一方面,使用multiprocess pipes而不是套接字可能是正確的方法,但我還沒有經驗。 此設置具有能夠在另一臺計算機上運行服務器和客戶端的附加好處。