Windows mutex to prevent multiple instances

Hans Nowak wurmy at earthlink.net
Wed Aug 28 14:50:28 EDT 2002


Howdy y'all,

In my current project, we have several programs that should not be run multiple 
times simultaneously. To prevent this from happening, I used a mutex, roughly 
like this (some irrelevant lines snipped):

         self.mutex = None

         try:
             import win32event, win32api, winerror
         except ImportError:
             print "No win32all available"
         else:
             self.mutex = win32event.CreateMutex(None, 1, name)
             lasterror = win32api.GetLastError()
             if lasterror == winerror.ERROR_ALREADY_EXISTS:
                 self.mutex = None
                 raise SingleInstanceError

First instance of a program runs, second one raises SingleInstanceError and quits.

Now, this works as expected, as long as I try it as the same user. (E.g. I open 
two command lines, and try to start the same program in both.) The situation on 
the production server is a bit different. A cron-like service runs a batch file 
with the program every N minutes. However, different users can log in and 
sometimes run the program by hand as well, for troubleshooting. We were 
assuming that if the thing was already running, they would get the error 
message, but this appears not to be the case. Apparently it doesn't work for 
different logins/users/processes or maybe it has something to with permissions.

So, my obvious question is, is there a way to make a "global mutex" to prevent 
this from happening? The server runs Windows 2000.

TIA,

-- 
Hans (base64.decodestring('d3VybXlAZWFydGhsaW5rLm5ldA=='))
# decode for email address ;-)
The Pythonic Quarter:: http://www.awaretek.com/nowak/
Kaa:: http://www.awaretek.com/nowak/kaa.html




More information about the Python-list mailing list