How to implement retrying a lock tidily in Python?
Dave Angel
davea at ieee.org
Sun Oct 17 17:19:56 EDT 2010
On 2:59 PM, tinnews at isbd.co.uk wrote:
> I'm writing some code that writes to a mbox file and want to retry
> locking the mbox file a few times before giving up. I can't see a
> really tidy way to implement this.
>
> Currently I have something like:-
>
> dest = mailbox.mbox(mbName, factory=None)
>
> for tries in xrange(3):
> try:
> dest.lock()
> #
> #
> # Do some stuff to the mbox file
> #
> dest.unlock()
> break # done what we need, carry on
>
> except mailbox.ExternalClashError:
> log("Destination locked, try " + str(tries))
> time.sleep(1)
> # and try again
>
> ... but this doesn't really work 'nicely' because the break after
> dest.unlock() takes me to the same place as running out of the number
> of tries in the for loop. I need a way to handle the case where we
> run out of tries (and *haven't* done what we needed to do) separately
> from the case where it worked OK.
>
> I can see all sorts of messy ways to handle this with a flag of some
> sort but is there a proper elegant way of doing it?
>
>
The usual idiom for telling whether you ever finished a loop is to use
the else: clause. Else is only executed if break was never executed.
for ....
if something
do...success
break
else
do ... one failure
(continue)
else:
...None of the loops succeeded
In your case you're using try/except, rather than if/else, but the outer
mechanism still holds.
DaveA
More information about the Python-list
mailing list