检查现有流程是否存在 - 是否存在,与之通信,否则创建新流程

时间:2012-04-11 08:20:23

标签: python concurrency

我确定之前已经问过这个问题,但我找不到它。

我编写了一个Python程序,给定一个目录,使用一个非常简单的启发式方法来确定如何解压缩"它的内容和目标目录。

只要新下载完成,就会执行此程序。如果很多下载完全在同一个地方完成,我会同时解压缩大量的进程。我想通过重写程序的大部分来解决这个问题,一次只能解压缩一个目录。

为了达到这个目的,我想我会使用"锁定/ PID"包含任何当前正在执行的程序的PID的文件。如果锁定/ PID文件存在,则新生成的进程应该只是将("queue", "D:/some/directory")行中的某些内容发送到现有进程,并让该进程在完成当前解包后解压缩该目标。

我如何在Python中实现这一目标?这必须适用于Windows系统,但理想情况下也适用于GNU / Linux。

2 个答案:

答案 0 :(得分:0)

如果您只想检查PID文件是否存在,可以使用:os.path

os.path.exists(path) 

答案 1 :(得分:0)

因为你已经在使用类似lockfile by Ben Finney

的东西了

示例:

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

您可能希望与正在运行的守护程序通信,您应该让守护程序侦听某个套接字,然后从生成的进程将数据发送到套接字。 (f.ex a udp socket)

所以在守护进程中:

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