Python threading: can I sleep on two threading.Event()s simultaneously?

前端 未结 8 1644
悲&欢浪女
悲&欢浪女 2020-12-09 03:35

If I have two threading.Event() objects, and wish to sleep until either one of them is set, is there an efficient way to do that in python? Clearly I could do

8条回答
  •  暖寄归人
    2020-12-09 03:47

    Extending Claudiu's answer where you can either wait for:

    1. event 1 OR event 2
    2. event 1 AND even 2

    from threading import Thread, Event, _Event
    
    class ConditionalEvent(_Event):
        def __init__(self, events_list, condition):
            _Event.__init__(self)
    
            self.event_list = events_list
            self.condition = condition
    
            for e in events_list:
                self._setup(e, self._state_changed)
    
            self._state_changed()
    
        def _state_changed(self):
            bools = [e.is_set() for e in self.event_list]
            if self.condition == 'or':                
                if any(bools):
                    self.set()
                else:
                    self.clear()
    
            elif self.condition == 'and':                 
                if all(bools):
                    self.set()
                else:
                    self.clear()
    
        def _custom_set(self,e):
            e._set()
            e._state_changed()
    
        def _custom_clear(self,e):
            e._clear()
            e._state_changed()
    
        def _setup(self, e, changed_callback):
            e._set = e.set
            e._clear = e.clear
            e._state_changed = changed_callback
            e.set = lambda: self._custom_set(e)
            e.clear = lambda: self._custom_clear(e)
    

    Example usage will be very similar as before

    import time
    
    e1 = Event()
    e2 = Event()
    
    # Example to wait for triggering of event 1 OR event 2
    or_e = ConditionalEvent([e1, e2], 'or')
    
    # Example to wait for triggering of event 1 AND event 2
    and_e = ConditionalEvent([e1, e2], 'and')
    

提交回复
热议问题