用装饰器写一个single instance

用装饰器写一个single instance

一、关于python的装饰器

python装饰器的形式有点像java的注解、用处有点像java的切面。具体的参考如下两篇文章:

https://www.zhihu.com/question/26930016

http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

二、一个脚本单一实例运行

有时候我们会有这种需求,只允许某个程序在系统中只有一个运行实例,即不允许程序“多开”。

There are several common techniques including using semaphores. The one I see used most often is to create a “pid lock file” on startup that contains the pid of the running process. If the file already exists when the program starts up, open it up and grab the pid inside, check to see if a process with that pid is running, if it is check the cmdline value in /proc/pid to see if it is an instance of your program, if it is then quit, otherwise overwrite the file with your pid. The usual name for the pid file is application_name.pid.

上面这段话抄袭自stackoverflow上的回答。就是写一个application_name.pid文件(该文件通常放在/var/run目录下),里面放着当前运行实例的pid。程序运行前先检查该pid的进程是否存在,存在则说明已经启动了该程序了,当前程序自动退出;如果不存在,则说明上次程序已经终止,可以运行当前程序,同时修改该pid值。

另外,除了使用pid文件的方法,还可以使用其他互斥方式:比如说绑定某个端口号,因为一个端口号只能被一个进程绑定。

三、写一个限制脚本单实例运行的装饰器

3.1 使用pid文件的方式

ps:上述代码中的fcntl只适用在linux、mac系统,windows不适用 =。=#

3.2 使用端口绑定的方式

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注