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

2015-05-15 11:56:28 +08:00
 love
在linux和windows上有通用的方法吗?

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

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

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

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

实际上如果不是天天启动,你可能一辈子上都碰不到。
saber000
2015-05-15 17:48:49 +08:00
@lilydjwg 赞同依云的做法
Cynic222
2015-05-15 23:38:58 +08:00
lilydjwg
2015-05-16 00:01:03 +08:00
@wyxfcy 好像不是原子操作也没什么问题呀,反正锁不会被两个进程同时获取。

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

https://tanronggui.xyz/t/191267

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

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

© 2021 V2EX