Semaphore Techniques
Nick Craig-Wood
nick at craig-wood.com
Wed Jul 29 07:29:56 EDT 2009
John D Giotta <jdgiotta at gmail.com> wrote:
> I'm looking to run a process with a limit of 3 instances, but each
> execution is over a crontab interval. I've been investigating the
> threading module and using daemons to limit active thread objects, but
> I'm not very successful at grasping the documentation.
>
> Is it possible to do what I'm trying to do and if so anyone know of a
> useful example to get started?
If you want a simple, cross platform way of doing it, then bind each
process to a different local tcp port.
Make a list of 3 ports, and try binding to each port in turn. If you
can't find a port to bind to then there are already 3 instances
running.
Something like this
import socket
PORTS = range(10000,10003)
lock_sock = None
def lock_process(_locks = []):
for port in PORTS:
sock = socket.socket()
try:
sock.bind(("localhost", port))
except socket.error, e:
sock = None
else:
_locks.append(sock)
break
else:
raise Exception("Too many instances of me running")
for i in range(5):
print "Trying",i+1
lock_process()
Which prints
Trying 1
Trying 2
Trying 3
Trying 4
Traceback (most recent call last):
File "<stdin>", line 20, in <module>
File "<stdin>", line 16, in lock_process
Exception: Too many instances of me running
You could do the same thing with lock files also very easily...
--
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick
More information about the Python-list
mailing list