views:

42

answers:

1

So this is a very weird situation, and I'm sure not very pythonic. But I'm not actually using this in any production code, I'm just considering how (if?) this could work. It doesn't have to be python specific, but I'd like a solution that at least WORKS within python framework.

Basically, I have a thread safe singleton object that implements __enter__ and __exit__ (so it can be used with with.


Singleton():
    l = threading.Lock()
    __enter__():
        l.acquire()
    __exit__():
        l.release()

In my example, one thread gets the singleton, and inside the with statement it enters an infinite loop.


def infinite():
    with Singleton():
        while True:
            pass

The goal of this experiment is to get the infinite thread out of its infinite loop WITHOUT killing the thread. Specifically using the Singleton object. First I was thinking of using an exception called from a different thread:


Singleton():
    ....
    def killMe():
        raise exception

But this obviously doesn't raise the exception in the other thread. What I thought next is that since the enter and exit methods acquire a class variable lock, is there any method that can be called on the Lock that will cause the thread that has acquired it to throw an exception?

Or, what I would probably do in C++ is just delete this or somehow call the destructor of the object from itself. Is there ANY way to do this in python? I know that if it's possible it will be a total hack job. But again, this is basically a thought experiment.

+1  A: 

In Python, there is a somewhat undocumented way of raising an exception in another thread, though there are some caveats. See this recipe for "killable threads":

http://code.activestate.com/recipes/496960-thread2-killable-threads/

http://sebulba.wikispaces.com/recipe+thread2

FogleBird
Playing around with this for learning purposes is fine, but see http://stackoverflow.com/questions/3827545#3827622 for why this is probably a very bad idea for production code.
Glenn Maynard