class ErrorhookedGreenlet(OriginalGreenlet): def _report_error(self, exc_info): sys.excepthook(exc_info[0], exc_info[1], exc_info[2]) if config.debug: sys.excepthook = handleError else: sys.excepthook = handleErrorNotify gevent.Greenlet = gevent.greenlet.Greenlet = ErrorhookedGreenlet reload(gevent) if __name__ == "__main__": import time from gevent import monkey monkey.patch_all(thread=False, ssl=False) import Debug def sleeper(): print "started" time.sleep(3) print "stopped" thread1 = gevent.spawn(sleeper) thread2 = gevent.spawn(sleeper) time.sleep(1) print "killing..." thread1.throw(Exception("Hello")) thread2.throw(Debug.Notify("Throw")) print "killed"
gevent.hub.Hub.handle_error = handleGreenletError try: signal.signal(signal.SIGTERM, lambda signum, stack_frame: shutdown("SIGTERM")) except Exception as err: logging.debug("Error setting up SIGTERM watcher: %s" % err) if __name__ == "__main__": import time from gevent import monkey monkey.patch_all(thread=False, ssl=False) import Debug def sleeper(num): print "started", num time.sleep(3) raise Exception("Error") print "stopped", num thread1 = gevent.spawn(sleeper, 1) thread2 = gevent.spawn(sleeper, 2) time.sleep(1) print "killing..." thread1.kill(exception=Debug.Notify("Worker stopped")) #thread2.throw(Debug.Notify("Throw")) print "killed" gevent.joinall([thread1, thread2])