getting a thread out of sleep

placid Bulkan at gmail.com
Wed Feb 21 19:10:51 EST 2007


On Feb 22, 10:20 am, mark <rkmr... at gmail.com> wrote:
> On 21 Feb 2007 14:47:50 -0800, placid <Bul... at gmail.com> wrote:
>
>
>
> > On Feb 22, 3:23 am, mark <rkmr... at gmail.com> wrote:
> > > On 20 Feb 2007 21:26:18 -0800, placid <Bul... at gmail.com> wrote:
>
> > > > On Feb 21, 4:21 pm, "placid" <Bul... at gmail.com> wrote:
> > > > > On Feb 21, 4:12 pm, mark <rkmr... at gmail.com> wrote:
> > > > > > On 20 Feb 2007 20:47:57 -0800, placid <Bul... at gmail.com> wrote:
> > > > > > > On Feb 21, 3:08 pm, mark <rkmr... at gmail.com> wrote:
> > > > > > > > Right now I have a thread that  sleeps for sometime and check if an
> > > > > > > > event has happened and go back to sleep. Now instead I want the thread
> > > > > > > > to sleep until the event has occured process the event and go back to sleep
>
> > > > > > > > class eventhndler(threading.Thread):
> > > > > > > >     def __init__(self):
> > > > > > > >         threading.Thread.__init__(self)
> > > > > > > >     def run(self):
> > > > > > > >         while True:
> > > > > > > >             time.sleep(SLEEPTIME)
> > > > > > > >             ''''do event stuff'''
>
> > > > > > > The way i would do this is by using an threading.Event (
> > > > > > >http://docs.python.org/lib/event-objects.html)
>
> > > > > > > <code>
>
> > > > > > > class eventhandler(threading.Thread):
> > > > > > >     def __init__(self):
> > > > > > >         threading.Thread.__init__(self)
> > > > > > >         self.event = threading.Event()
> > > > > > >     def run:
> > > > > > >         while True:
> > > > > > >             # block until some event happens
> > > > > > >             self.event.wait()
> > > > > > >             """ do stuff here """
> > > > > > >             self.event.clear()
> > > > > > > </code>
>
> > > > > > > the way to use this is to get the main/separate thread to set() the
> > > > > > > event object.
>
> > > > > > Can you give an example of how to get the main threead to set teh event object?
> > > > > > this is exactly what i wanted to do!
> > > > > > thanks a lot!
> > > > > > mark>
> > > > oops I've miss-typed the thread variable name the following should
> > > > work
>
> > > > <code>
> > > > if __name__ == "__main__":
> > > >     evtHandlerThread = eventhandler()
> > > >     evtHandlerThread.start()
>
> > > >     # do something here #
> > > >     evtHandlerThread.event.set()
>
> > > >     # do more stuff here #
> > > >     evtHandlerThread.event.set()
>
> > > > </code>
>
> > > Can I have the same thread process two or more events? Can you tell
> > > how to do this? The code you gave is waiting on one event right. How
> > > can I do it for more events?
> > > thanks a lot!
> > > mark
>
> > I don't think a thread can block on more than one event at a time. But
> > you can make it block on more then one event one at a time.
>
> > <code>
>
> > class eventhandler(threading.Thread):
> >    def __init__(self):
> >        threading.Thread.__init__(self)
> >        self.events = [threading.Event(), threading.Event()]
> >        self.currentEvent = None
> >    def run:
> >        while True:
> >            for event in self.events:
> >                self.currentEvent = event
> >                # block until some event happens
> >                self.currentEvent.wait()
> >                """ do stuff here """
> >                self.currentEvent.clear()
>
> > if __name__ == "__main__":
> >     evtHandlerThread = eventhandler()
> >     evtHandlerThread.start()
>
> >     # do something here #
> >     evtHandlerThread.currentEvent.set()
>
> >     # do more stuff here #
> >     evtHandlerThread.currentEvent.set()
>
> > </code>
>
> > what the thread does is sequentially waits for two events to happen
> > and then execute the same code. You could change this code to perform
> > different functions for different event objects.
>
> Once the thread starts it is going to wait on the event that is the
> first element of the list right?  This would mean :

This is correct.

> evtHandlerThread.currentEvent.set(): that I have only one event right?

this means that the current event occurred.

> Can you explain how I can have different event objects. I dont see how
> I can do different functinos for same event.
>
> Thanks a lot!
>
> mark

To run different functions for the same event is easy, just write a
wrapper class around threading.event() and include some method that
you will run and assign this to different functions for each
EventWrapper.

<code>

class EventWrapper():
    def __init__(self,work ):
         self.event = threading.Event()
         self.eventWork = work

   def wait(self):
        self.event.wait()

   def clear(self)
        self.event.clear()

    def eventWork(self):
        print "no work"

class eventhandler(threading.Thread):
     def __init__(self, events = None):
         threading.Thread.__init__(self)
         self.events = events
         self.currentEvent = None
     def run:
         while True:
             if self.events:
                 for event in self.events:
                     self.currentEvent = event
                     # block until the current event happens
                     self.currentEvent.wait()
                     self.currentEvent.eventWork()
                     self.currentEvent.clear()

def eventOneWork():
    # do some event 1 specific work here

def eventTwoWork():
    # do some event 2 specific work here

if __name__ == "__main__":
      events = [EventWrapper(eventOneWork),EventWrapper(eventTwoWork)]

      evtHandlerThread = eventhandler(events)
      evtHandlerThread.start()

      # do something here #
      evtHandlerThread.currentEvent.set()
      # do more stuff here #
      evtHandlerThread.currentEvent.set()

</code>

So you have a EventWrapper class that now contains the Event object
and a workEvent() method which is assigned to a function you create.

Hope this helps.

Cheers




More information about the Python-list mailing list