Eventuali duplicati:
Python: single instance of programImpedire l'esecuzione istanze simultanee di uno script python
Ho bisogno di evitare un processo di cron esecuzione istanze simultanee quando un lavoro richiede più tempo per completare rispetto al programma di avvio intervallo. Sto cercando di usare il concetto di flock per raggiungere questo obiettivo, ma il modulo fcntl non si comporta come mi aspetto.
Qualcuno può dirmi perché questo funziona per evitare che due istanze simultanee:
import sys
import time
import fcntl
file_path = '/var/lock/test.py'
file_handle = open(file_path, 'w')
try:
fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB)
print 'no other instance is running'
for i in range(5):
time.sleep(1)
print i + 1
except IOError:
print 'another instance is running exiting now'
sys.exit(0)
E perché questo non funziona:
import sys
import time
import fcntl
def file_is_locked(file_path):
file_handle = open(file_path, 'w')
try:
fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB)
return False
except IOError:
return True
file_path = '/var/lock/test.py'
if file_is_locked(file_path):
print 'another instance is running exiting now'
sys.exit(0)
else:
print 'no other instance is running'
for i in range(5):
time.sleep(1)
print i + 1
Possibile duplicato di http://stackoverflow.com/questions/380870/python-single-instance-of-program. Che ha anche fatto girare una libreria chiamata [tendo] (http://pypi.python.org/pypi/tendo) per gestire tutti i fastidiosi problemi multipiattaforma. Ovviamente non risponde "Perché funziona A ma non B?" domanda, ma risolve la domanda di fondo "Come devo fare questo?" – abarnert