estoy usando Python 2.7fcntl.flock - cómo implementar un tiempo de espera?
Quiero crear una función de envoltura alrededor de fcntl.flock() que el tiempo de espera después de un intervalo de tiempo establecido:
wrapper_function(timeout):
He intentado llamar en otro hilo y el uso de hilo .join (tiempo de espera), pero parece que fcntl.flock() sigue bloqueando:
def GetLock(self, timeout):
"""Returns true if lock is aquired, false if lock is already in use"""
self.__lock_file = open('proc_lock', 'w')
def GetLockOrTimeOut():
print 'ProcessLock: Acquiring Lock'
fcntl.flock(self.__lock_file.fileno(), fcntl.LOCK_EX)
print 'ProcessLock: Lock Acquired'
thread = threading.Thread(target=GetLockOrTimeOut)
thread.start()
thread.join(timeout)
if thread.isAlive():
print 'GetLock timed out'
return False
else:
return True
he mirado en soluciones para la terminación de hilos, la solución más popular parece ser sub-clasificar a threading.Thread y añadiendo una característica para aumentar una excepción en el hilo. Sin embargo, me encontré con un link que dice que este método no funcionará con llamadas nativas, y estoy seguro de que fcntl.flock() llama a una función nativa. Sugerencias?
Contexto: Estoy usando un bloqueo de archivos para crear una aplicación de instancia única, pero no quiero que una segunda instancia de la aplicación se quede ahí y cuelgue hasta que termine la primera instancia.
+1, esta es exactamente la forma correcta de hacerlo.Así es también como funciona la herramienta shell ['flock (1)'] (http://linux.die.net/man/1/flock) (el código fuente está disponible en [ftp://ftp.kernel.org/pub] /linux/utils/util-linux-ng/](ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/)) –
de acuerdo, esta es una mejor manera. –
¿Hay alguna manera de llevar esto a cabo cuando el hilo principal no invoque necesariamente el fcntl.flock? – UsAaR33