我确定之前已经问过这个问题,但我找不到它。
我编写了一个Python程序,给定一个目录,使用一个非常简单的启发式方法来确定如何解压缩"它的内容和目标目录。
只要新下载完成,就会执行此程序。如果很多下载完全在同一个地方完成,我会同时解压缩大量的进程。我想通过重写程序的大部分来解决这个问题,一次只能解压缩一个目录。
为了达到这个目的,我想我会使用"锁定/ PID"包含任何当前正在执行的程序的PID的文件。如果锁定/ PID文件存在,则新生成的进程应该只是将("queue", "D:/some/directory")
行中的某些内容发送到现有进程,并让该进程在完成当前解包后解压缩该目标。
我如何在Python中实现这一目标?这必须适用于Windows系统,但理想情况下也适用于GNU / Linux。
答案 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而不是套接字可能是正确的方法,但我还没有经验。 此设置具有能够在不同计算机上运行服务器和客户端的额外好处。