def pop_all (self):
# DNS query maybe not allowed delay between request and send
# maybe they just drop response packet for delaying
with self.lock:
queue, self.queue = self.queue [:], []
count = len (queue)
while queue:
name, args = queue.pop (0)
self.handler.handle_request (name, **args)
if (not count and not self.has_job ()):
return
map = {}
with self.lock:
for client in self.udps:
map [client._fileno] = client
fds = list (map.keys ())
# maybe 2 is enough
safeguard = count * 2
while self.has_job () and safeguard:
safeguard -= 1
asyncore.loop (0.1, map, count = 1)
if safeguard % 5 == 0:
self.maintern (time.time ())
self.maintern (time.time ())
for fd in fds:
if fd not in map:
# resync
try: del asyncore.socket_map [fd]
except KeyError: pass
评论列表
文章目录