python 程序怎么能保证只运行一个实例?第二个实例起来时发现有现有进程自动退出?

2015 年 5 月 15 日
 love
在linux和windows上有通用的方法吗?

在linux上,一般都是用个lock文件来作锁,只是这种方式也有缺点,比如程序崩溃后文件没删除需要手工处理。

PS. 以前学Windows C语言编程时Windows提供系统级锁对象,只是这是在python不好应用。
11224 次点击
所在节点    Python
31 条回复
ksc010
2015 年 5 月 15 日
我现在用的是pid文件吧 进程id写道文件里面
lilydjwg
2015 年 5 月 15 日
我有现成的代码,适用于类 UNIX 系统,Windows 不知道: https://github.com/lilydjwg/winterpy/blob/master/pylib/pidfile.py

用的是写有 pid 的锁文件。当然更好的办法是使用 flock。@billlee: fcntl 的锁(旧锁,不是 Linux 新加的那个)在多线程情况下会出问题的。而且我在 FreeBSD 上试过,得到了非预期的结果。

监听套接字也是个不错的主意,还可以在这个套接字上搞搞 RPC 什么的 :-)
lazywen
2015 年 5 月 15 日
pid + 判断这个pid的进程、运行参数,我之前是这样搞的
wibile
2015 年 5 月 15 日
既然有一个进程在运行,为什么还要启动第二个?我遇到的情况都是用supervisord启动程序,程序退出自动重启。
juntao
2015 年 5 月 15 日
tabris17
2015 年 5 月 15 日
windows下貌似不支持fcntl
wyxfcy
2015 年 5 月 15 日
@lilydjwg FreeBSD/Mac 下用 OPEN 调用加创建和加锁参数,是一个原子操作。 Linux下不支持,只能先OPEN 再 LOCK,不是原子操作。
9hills
2015 年 5 月 15 日
@love PID重复带来的后果就是某次恰好启动不了而已。概率很小且手动处理方便

实际上如果不是天天启动,你可能一辈子上都碰不到。
saber000
2015 年 5 月 15 日
@lilydjwg 赞同依云的做法
Cynic222
2015 年 5 月 15 日
lilydjwg
2015 年 5 月 16 日
@wyxfcy 好像不是原子操作也没什么问题呀,反正锁不会被两个进程同时获取。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/191267

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX