等到在Python中创建互斥锁(win32)

时间:2013-03-20 14:40:54

标签: python winapi mutex

我正在使用 win32event Python模块与在另一个程序中创建的互斥锁进行交互(基于C#)

我的代码打开一个互斥锁,然后等待它:

hWait = win32event.OpenMutex(win32con.MUTEX_ALL_ACCESS, False, "mutexname")
win32event.WaitForSingleObject(hWait, 20000)

此代码的问题在于,如果尚未创建互斥锁,则会失败(例如,如果python程序在C#程序创建之前尝试打开互斥锁)。

如何在创建互斥锁之前阻止?有没有允许这个的Python或库方法?

2 个答案:

答案 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在另一个已经运行的线程中运行某事件的事件(请参阅我关于如何等待事件直到它发生的其他答案)。