将"创建信号"转换为Linux

你好,
在我的应用程序中,我正在使用
hsem = win32event.CreateSemaphore(无,1,
1,"字符串IncludingInterfaceandport")
rt = win32event.waitforsingleobject(HSEM,0)
如果rt!= win32event.wait_timeout:
真正_do_start_my_app()
别的:
打印"已准备好运行的应用程序"
为了确保仅一个应用程序的一个实例在一个
时间. (由于它实现了本地网络服务器,这是必要的.
网络服务员在一个端口上收听是不好的)
现在,我将在Linux上运行此应用程序.我怎样才能得到
Linux上的类似行为?
我知道某些服务器进程编写的.pid文件...
但是,在应用程序的不干净关闭时,他们不会被清理.
有更好的方法吗?
还是一些将.pid-files的细节包裹得很好的模块?
(例如"试图删除以检查其他实例是否仍在
运行....,在缺少写私人等时正确失败了)
最好的祝愿,
Harald

# 回答1


Ghum写道:
您可以考虑为此使用合作文件锁定.我这样做
以下内容:
#------------------------------------------------------------------------------ ------------------------------------------
lockfilecreationexception类(异常):
经过
#------------------------------------------------------------------------------ ------------------------------------------
lockobtainexception(异常):
经过
#------------------------------------------------------------------------------ ------------------------------------------
lockfile(对象):
def __init __(self,name,fail_on_lock = false,callup = true):
self.name =名称
self.cleanup =清理
尝试:
self.fd = os.open(name,os.o_wronly | os.o_creat | os.o_append)
除了Oserror,E:
如果E [0] == 2:
提高LockFileCreationException()
self.file = os.fdopen(self.fd," w")
lock_flags = fcntl.lock_ex
如果fail_on_lock:
lock_flags | = fcntl.lock_nb
尝试:
fcntl.flock(self.file,lock_flags)
除了ioError,E:
如果E [0] == 11:
提高lockobtainexception()
增加
def __enter __(self):
返回self.file
def __exit __(self,unused_exc_type,unused_exc_val,unused_exc_tb):
self.file.close()
#我们被告知要清理自己,
#但是可能是另一个过程
#已经这样做了 - 所以我们不会失败
# 案子.
如果self.cleanup:
尝试:
os.remove(self.name)
除了Oserror,E:
如果不是E [0] == 2:
增加
您可以将Lockfile用作上下文,并且要任一块直到锁定为止
发布(很可能不是您想要的),或者失败
LockObtainException.
diez
# 回答2


在29岁以前,13:28,ghum 我知道这样做的最好方法是使用fnctl.flock或fcntl.lockf
功能.我从未使用过,所以只能将您指向
官方文件.这个想法是您的申请应接受
对一个应用程序文件之一的独家访问,以便如果是
第二次开始,第二次运行将找到锁定的文件,并且
了解有一个实例.
afaik,如果锁定文件的过程死亡,则操作系统会释放锁,
因此,不可能陈旧锁(检查一下!).
无论如何,您可以简单地使用您的Ser Ver插座作为锁.它不是
可能有两个过程接受同一端口上的连接,
第二个过程将收到一个错误"已在使用中正在使用".
您可以将其用作信号表明
已经运行应用程序的实例.此方法应该是
在Windows和Linux中都可以使用(以及各种
Unix的口味也),因此您的代码将更加便携.
再见
------
fb
# 回答3


Ghum写道:
承担着教我祖母的严重风险,但是...
....为什么要使用信号量而不是静音?或为什么不
只需将绑定插座用作自己的静音吗?我知道
Windows不允许您重新启动相同的插座
在两个不同的过程中相同的addr/端口(除非
您可以使用套接字选项播放一些骗局.
tjg
# 回答4


蒂姆,
如我所了解的,MSDN http://msdn.microsoft.com/en-us/libr...27(vs.85).aspx http://msdn.microsoft.com/en-us/libr ... 46(vs.85).aspx
静音似乎只不过是信号量的特殊情况吗?
也就是说,可以创建信号量以允许max_sem_count并发
跑步者,Mutex默认为一个,只有一个...
其他API串是相同的,例如wait_for_xxxx ...;如此提高
我之前偶然发现了工作信号码,或者在某些古老的代码中
Win32包装器CreateMutex未记录在其中或其中的内容
方面:)
我的经验是,对于某些"允许"的值,这是正确的
和"骗局".有时装订似乎被允许,但确实
不行.主要原因是插座绑带发生在某个地方
medusa或;因此将其用作
信号我将不得不在那里挖掘.我不确定什么
插座上的骗局在那里播放;我更喜欢呆在远处
尽可能远离该区域.
Harald
# 回答5


Ghum写道:
如我所了解的,MSDN http://msdn.microsoft.com/en-us/libr...27(vs.85).aspx http://msdn.microsoft.com/en-us/libr ... 46(vs.85).aspx
静音似乎只不过是信号量的特殊情况吗?
也就是说,可以创建信号量以允许max_sem_count并发
跑步者,Mutex默认为一个,只有一个...
其他API串是相同的,例如wait_for_xxxx ...;如此提高
我之前偶然发现了工作信号码,或者在某些古老的代码中
Win32包装器CreateMutex未记录在其中或其中的内容
方面:)
我认为除了某人(像我一样:))之外,这无关紧要
来到您熟悉Mutex用途的代码
还有其他地方的信号 - 它们不是Microsoft的发明
我确定您意识到 - 会被
静音的事实几乎是规范的食谱
仅允许一个应用程序,但是您正在使用一个
可以用来稍有不同的信号
目的.我想知道你还有更多
考虑到我无法理解的复杂模型...
我的经验是,对于" Allo的某些值)是正确的 W" 和"骗局". 有时装订似乎被允许,但确实 不行. 很公平. tjg

标签: python

添加新评论