How to implement retrying a lock tidily in Python?

Matteo Landi landimatte at gmail.com
Sun Oct 17 13:15:28 EDT 2010


You can use the 'else' keyword outside the for loop:

for <condition>:
  if <condition>:
    break
else
  <some operations>

The execution will step inside the else branch if the for loop ends
normally, i.e. without encountering a break keyword.
Hope it helps.

Regards,
Matteo

On Sun, Oct 17, 2010 at 6:58 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?
>
>
> --
> Chris Green
> --
> http://mail.python.org/mailman/listinfo/python-list
>



-- 
Matteo Landi
http://www.matteolandi.net/



More information about the Python-list mailing list