我正在使用 win32event Python模块与在另一个程序中创建的互斥锁进行交互(基于C#)
我的代码打开一个互斥锁,然后等待它:
hWait = win32event.OpenMutex(win32con.MUTEX_ALL_ACCESS, False, "mutexname")
win32event.WaitForSingleObject(hWait, 20000)
此代码的问题在于,如果尚未创建互斥锁,则会失败(例如,如果python程序在C#程序创建之前尝试打开互斥锁)。
如何在创建互斥锁之前阻止?有没有允许这个的Python或库方法?
答案 0 :(得分:0)
注意,当使用win32event.WaitForSingleObject
时,不是指定一些任意但足够长的时间来等待(20000),也可以简单地使用win32event.INFINITE
无限期地阻塞直到事件发生,如:
win32event.WaitForSingleObject(waitable, win32event.INFINITE)
这可能很有用,例如当您需要在另一个线程中告知互斥锁打开的代码时。
由于等待互斥锁失败(如果尚未创建),我们会创建一个事件,以便在打开互斥锁时触发。
mutex_open = win32event.CreateEvent(None, 0, 0, None)
然后启动一个等待事件的线程:
def wait_for_opening(open_evt):
win32event.WaitForSingleObject(open_evt, win32event.INFINITE)
print("Got notified that mutex is now open.")
waiter = threading.Thread(target=wait_for_opening, args=(mutex_open,))
waiter.start()
要模拟其他程序,请在一段时间后启动另一个将创建互斥锁的线程:
def delayed_create():
time.sleep(1)
m = CreateMutex(None, True, u"mutexname")
creator = threading.Thread(target=delayed_create)
creator.start()
最后,运行等待互斥锁打开的循环,并在此之后设置事件。
while True:
try:
hWait = win32event.OpenMutex(MUTEX_ALL_ACCESS, False, "mutexname")
except pywintypes.error:
pass
else:
win32event.SetEvent(mutex_open)
break
请注意setEvent
来电。
因此,在运行代码时,一段时间后,waiter
线程会收到有关互斥锁现在已打开的通知。
答案 1 :(得分:0)
正如@manuell(在评论中)所指出的,简单的解决方案是循环,直到创建互斥锁,静默捕获互斥锁尚不存在时引发的错误:
while True:
try:
hWait = win32event.OpenMutex(MUTEX_ALL_ACCESS, False, "mutexname")
except pywintypes.error:
pass
else:
break
根据你的情况的具体情况,你可能想要在循环中显式地睡眠,将等待循环放在一个单独的线程中,或者将其转换为生成器或协同程序,或者使用它来触发win32在另一个已经运行的线程中运行某事件的事件(请参阅我关于如何等待事件直到它发生的其他答案)。