Killing threads (was Re: Cancel or timeout a long running regular expression)

Ian Kelly ian.g.kelly at gmail.com
Mon Sep 19 01:41:29 EDT 2011


On Sat, Sep 17, 2011 at 5:38 PM, Chris Angelico <rosuav at gmail.com> wrote:
> But if it's done as an exception, all you need is to
> catch that exception and reraise it:
>
> def threadWork(lock, a1, a2, rate):
>   try:
>       while True:
>               time.sleep(rate)
>               lock.lock()
>               t = a2.balance / 2
>               a1.balance += t
>               #say a thread.kill kills at this point
>               a2.balance -= t
>               lock.release()
>  except:
>      # roll back the transaction in some way
>      lock.release()
>      raise

And what if the thread gets killed a second time while it's in the except block?

> It'd require some care in coding, but it could be done. And if the
> lock/transaction object can be coded for it, it could even be done
> automatically:
>
> def threadWork(lock, a1, a2, rate):
>       while True:
>               time.sleep(rate)
>               transaction.begin()
>               t = a2.balance / 2
>               transaction.apply(a1.balance,t)
>               #say a thread.kill kills at this point
>               transaction.apply(a2.balance,-t)
>               transaction.commit()
>
> If the transaction object doesn't get its commit() called, it does no
> actions at all, thus eliminating all issues of locks.

And what if the thread gets killed in the middle of the commit?

Getting the code right is going to be a lot more complicated than just
adding a couple of try/excepts.

Cheers,
Ian



More information about the Python-list mailing list