Python 中的程序实例队列?



基本上,我想让它一次只能运行我的程序的一个实例。快速的谷歌搜索发现这个解决方案可以防止程序的两个实例运行,我在下面进行了调整,以等到前一个实例完成再运行。

import fcntl, sys
pid_file = 'program.pid'
fp = open(pid_file, 'w')
while True:
try:
fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
# another instance is running
continue
break

但是,这并不真正尊重程序的调用时间。

例如,假设我在 10:00 运行此程序,它运行了 5 分钟。然后,假设我在 10:01 和 10:02 再次运行此程序。无法保证在 10:01 运行的实例将是第一个执行的实例。

我想按时间创建一个运行队列,其中对程序的第一次调用是下一个运行的调用。有没有简单的解决方案?我可以想象每个程序在启动/完成时将其进程 ID 写入/删除到日志文件中,并检查它是否在日志中的下一个,但这似乎有点不优雅。

我可以想象以下内容:

伪代码

def Signal_Handler(signal):
FIFO.push(signal.job_data)
def main(job_data):
while True:
process_Job(job_data)
job_data = FIFO.pop()
if not job_data:
break
if __name__ == '__main__':
job_data = sys.argv[1]
if Lock_Programm():
# First Instance
Signal.Handler(SIG_USR1, Signal_Handler)
main(job_data)
Unlock_Programm()
else:
# Lock failed other Instance is running
Signal.signal(SIG_USR1, job_data)
exit(1)

最新更新