2012-04-11 99 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而不是套接字可能是正确的方法,但我还没有经验。 此设置具有能够在另一台计算机上运行服务器和客户端的附加好处。