Python threading question (Working with a method that blocks forever)
- by Nix
I am trying to wrap a thread around some receiving logic in python. Basically we have an app, that will have a thread in the background polling for messages, the problem I ran into is that piece that actually pulls the messages waits forever for a message. Making it impossible to terminate... I ended up wrapping the pull in another thread, but I wanted to make sure there wasn't a better way to do it.
Original code:
class Manager:
def __init__(self):
receiver = MessageReceiver()
receiver.start()
#do other stuff...
class MessageReceiver(Thread):
receiver = Receiver()
def __init__(self):
Thread.__init__(self)
def run(self):
#stop is a flag that i use to stop the thread...
while(not stopped ):
#can never stop because pull below blocks
message = receiver.pull()
print "Message" + message
What I refectored to:
class Manager:
def __init__(self):
receiver = MessageReceiver()
receiver.start()
class MessageReceiver(Thread):
receiver = Receiver()
def __init__(self):
Thread.__init__(self)
def run(self):
pullThread = PullThread(self.receiver)
pullThread.start()
#stop is a flag that i use to stop the thread...
while(not stopped and pullThread.last_message ==None): pass
message = pullThread.last_message
print "Message" + message
class PullThread(Thread):
last_message = None
def __init__(self, receiver):
Thread.__init(self, target=get_message, args=(receiver))
def get_message(self, receiver):
self.last_message = None
self.last_message = receiver.pull()
return self.last_message
I know the obvious locking issues exist, but is this the appropriate way to control a receive thread that waits forever for a message?
One thing I did notice was this thing eats 100% cpu while waiting for a message...
**If you need to see the stopping logic please let me know and I will post.