等待在Python(win32)中创建互斥体

2024-10-01 09:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用win32eventPython模块与另一个程序(基于C)创建的互斥体进行交互

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

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

这段代码的问题在于,如果互斥体尚未创建(例如,如果python程序在C程序创建互斥体之前尝试打开互斥体),它就会失败。在

在创建互斥体之前如何阻止?是否有任何Python或library方法允许这样做?在


Tags: 模块代码程序falseaccesslibraryallmutex
2条回答

正如@manuell(在评论中)指出的,简单的解决方案是循环直到创建互斥体,静默地捕捉互斥体尚不存在时引发的错误:

while True:

   try:
      hWait = win32event.OpenMutex(MUTEX_ALL_ACCESS, False, "mutexname")
   except pywintypes.error:
      pass
   else:
      break

根据情况的具体情况,例如,您可能希望显式地在循环内部休眠一点,将等待的循环放入单独的线程中,或者将其转换为生成器或协同程序,或者用它来触发一个win32事件,在另一个已经运行的线程中运行某个东西(请参阅我的另一个关于如何等待事件发生的答案)。在

请注意,在使用win32event.WaitForSingleObject时,可以简单地使用win32event.INFINITE无限期地阻止,直到事件发生,而不是指定一些任意但足够长的时间等待(20000),如:

win32event.WaitForSingleObject(waitable, win32event.INFINITE)

例如,当您需要告诉另一个线程中的代码互斥体已打开时,这很有用。在

由于等待互斥体(如果尚未创建)将失败,因此我们将创建一个事件,以便在互斥体打开时触发。在

^{pr2}$

然后启动一个等待事件的线程:

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线程会收到互斥体现在已打开的通知。在

相关问题 更多 >