def event_loop(catch_signals = (signal.SIGINT, signal.SIGTERM)):
"""
Replacement for asyncore.loop(), adding timer and signal support.
"""
old_signal_handlers = {}
while True:
save_sigs = len(old_signal_handlers) == 0
try:
for sig in catch_signals:
old = signal.signal(sig, _raiseExitNow)
if save_sigs:
old_signal_handlers[sig] = old
while asyncore.socket_map or timer_queue:
t = timer.seconds_until_wakeup()
if debug_event_timing:
logger.debug("Dismissing to asyncore.poll(), t = %s, q = %r", t, timer_queue)
asyncore.poll(t, asyncore.socket_map)
timer.runq()
if timer.gc_debug:
gc.collect()
if gc.garbage:
for i in gc.garbage:
logger.debug("GC-cycle %r", i)
del gc.garbage[:]
except ExitNow:
break
except SystemExit:
raise
except ValueError, e:
if str(e) == "filedescriptor out of range in select()":
logger.error("Something is badly wrong, select() thinks we gave it a bad file descriptor.")
logger.error("Content of asyncore.socket_map:")
for fd in sorted(asyncore.socket_map.iterkeys()):
logger.error(" fd %s obj %r", fd, asyncore.socket_map[fd])
logger.error("Not safe to continue due to risk of spin loop on select(). Exiting.")
sys.exit(1)
logger.exception("event_loop() exited with exception %r, this is not supposed to happen, restarting")
except Exception, e:
logger.exception("event_loop() exited with exception %r, this is not supposed to happen, restarting")
else:
break
finally:
for sig in old_signal_handlers:
signal.signal(sig, old_signal_handlers[sig])
评论列表
文章目录