设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Python
›
python: 令任意时刻,系统中只有脚本的唯一实例在运行? ...
返回列表
查看:
1644
|
回复:
6
python: 令任意时刻,系统中只有脚本的唯一实例在运行?
[复制链接]
Chowroc
Chowroc
当前离线
积分
555
IP卡
狗仔卡
发表于 2006-4-29 14:09:13
|
显示全部楼层
|
阅读模式
一个 python 脚本,欲令在任意时刻,系统中都只有一个该脚本的唯一实例在运行,应该怎么办为好?主要是要来讲一些文件分析、过滤并将一些记录导入数据库,如果两个实例同时运行,则导入的数据就无法保持准确了。
我现在想的一种可行办法是写文件。但不知道有没有更好的办法,例如共享内存、命名管道等?
只看到线程的共享内存,不知道进程如何实现。命名管道,如果没有两个实例则会阻塞,不知道有什么好办法?
谢谢。
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
Archetype
Archetype
当前离线
积分
122
IP卡
狗仔卡
发表于 2006-5-6 17:29:49
|
显示全部楼层
就我的理解,如果想刻意限制某脚本只能运行一个实例,那么很可能得跟操作系统的进程管理等特性打交道。因为不同脚本实例很可能运行在不同的Python虚拟机上,就得考虑跨Python虚拟机的脚本互斥问题。
对跨平台的Python来说,与操作系统的特定功能有关的东西,如果没有对应的模块帮助,很可能有点麻烦。我觉得利用写文件自己实现一个锁定机制还是一个既方便又好用的解决方案:
比如脚本每隔一定时间就向特定文件写入时间戳,以及自己的信息。脚本如果出现第二个实例,在检查时间戳时如果在更新期限内,那么认为有其他实例在运行,自己退出或者休眠;如果时间戳过期,则认为其他实例已经退出等等。
这个解决方案,只要在更新时间戳的时候锁定存储时间戳的文件,防止同时写入,我想就可以了。
----
后来查了一下,os.getpid()函数是跨Windows和*nix的,可以获得当前脚本所在进程信息;可是其他的进程管理功能基本上都得针对不同操作系统分别处理。
回复
支持
反对
使用道具
举报
显身卡
pupilzeng
pupilzeng
当前离线
积分
2280
IP卡
狗仔卡
发表于 2006-5-8 09:35:43
|
显示全部楼层
记得看过limodou写的一篇文章,讲到了newedit中使用的技术,就是让它只有一个实例在运行:当有一个实例已经在运行的时候,如果其用newedit打开文件的话,那么它会使用当前在运行的newedit打开文件,而不是新启动一个newedit实例。
忘了它在windows上的实现,蛮简单的,好像是因为Windows本身就支持这种功能。
在Linux上的实现,是建立一个Unix domain socket,进行监听。在打开的时候,先尝试连接这个socket,如果连接成功的话,说明有一个实例在运行,然后就往这发送文件名,那么当前正在运行的实例接收到这个文件名的时候,就将其打开,而第二个实例在发送完文件之后,就退出。
一下子找不到那篇文章了,这些都只是凭记忆说的。如果错了,请指出。
回复
支持
反对
使用道具
举报
显身卡
Chowroc
Chowroc
当前离线
积分
555
IP卡
狗仔卡
楼主
|
发表于 2006-5-8 10:37:22
|
显示全部楼层
也许应该使用 pid file 是比较好的方法
回复
支持
反对
使用道具
举报
显身卡
jhuangjiahua
jhuangjiahua
当前离线
积分
9502
IP卡
狗仔卡
发表于 2006-5-17 23:44:24
|
显示全部楼层
用文件锁就可以了
打开一个文件,加锁
BTW: pid file 不是很可靠的,要考虑进程意外中止
回复
支持
反对
使用道具
举报
显身卡
jacksjy
jacksjy
当前离线
积分
5
IP卡
狗仔卡
发表于 2006-5-22 17:25:56
|
显示全部楼层
用socket 也是可以的
回复
支持
反对
使用道具
举报
显身卡
OneZ
OneZ
当前离线
积分
115
IP卡
狗仔卡
发表于 2006-8-13 17:26:29
|
显示全部楼层
以前在C++程序里是这样处理的,
1. Windows平台下,调用Win32 API函数FindWindow,如果有句柄返回,说明已经运行。把句柄对应的窗口提前,然后自己退出。
2. Unix平台下,临时目录里放一个互斥文件锁。
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表