class ThreadSynchronizer(object):
    def __init__(self):
        self.event_pipe = PollableEvent()
        self.reverse_sync_event = Event()

    def sync_from_main(self, callback=None):
        """Each call will trigger a read event (POLLIN) on event_pipe.
        """
        self.event_pipe.set()
        if callback:
            callback()
        self.reverse_sync_event.wait(2)
        assert self.reverse_sync_event.isSet()
        self.reverse_sync_event.clear()
        assert not self.event_pipe.isSet()
        assert not self.reverse_sync_event.isSet()

    def sync_from_reactor_thread(self):
        self.event_pipe.clear()
        self.reverse_sync_event.set()
 def __init__(self):
     self.event_pipe = PollableEvent()
     self.reverse_sync_event = Event()