Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 1, 2009 23:03:57

nerezus
От:
Зарегистрирован: 2006-08-01
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

Синхронизация через мьютекс

class InterProcessLock(object):
def lock(self, delta=0.01):
while True:
try:
self.lockNoWait()
break;
except:
time.sleep(delta)

def __init__(self, name=None):
self.mutex = None
if not name:
name = sys.argv[0]
self.name = base64.b64encode(name).replace('=','')

def lockNoWait(self):
self.mutex = win32event.CreateMutex(None, 0, self.name)
if win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS:
self.mutex.Close()
self.mutex = None
raise Exception('acquired')

def unlock(self):
self.mutex.Close()
lock = InterProcessLock('name')
lock.lock()
bebebe()
lock.unlock()

Нужно сделать многопроцессную крит. секцию.
ЭТО работает в 90% случаем, в 10 процентах же говорит:
error in thread: ‘NoneType’ object has no attribute ‘Close’



Офлайн

#2 Июль 8, 2011 19:17:33

usmix
От:
Зарегистрирован: 2011-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Синхронизация через мьютекс

Немного исправленный код:

    def lockNoWait(self):
try:
self.mutex = win32event.CreateMutex(None, 0, self.name)
except win32api.error, e:
#print str(e)
if self.mutex is not None:
self.mutex.Close()
self.mutex = None
#else:
#print 'self.mutex == None'

raise Exception('acquired')



Отредактировано (Июль 8, 2011 19:20:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version