|  | @@ -80,7 +80,7 @@ import logging
 | 
	
		
			
				|  |  |  import socket
 | 
	
		
			
				|  |  |  import threading
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -from time import sleep
 | 
	
		
			
				|  |  | +from time import sleep, time
 | 
	
		
			
				|  |  |  from Queue import Empty
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from billiard.exceptions import WorkerLostError
 | 
	
	
		
			
				|  | @@ -371,6 +371,9 @@ class Consumer(object):
 | 
	
		
			
				|  |  |              fdmap = hub.fdmap
 | 
	
		
			
				|  |  |              poll = hub.poller.poll
 | 
	
		
			
				|  |  |              fire_timers = hub.fire_timers
 | 
	
		
			
				|  |  | +            apply_interval = hub.timer.apply_interval
 | 
	
		
			
				|  |  | +            apply_after = hub.timer.apply_after
 | 
	
		
			
				|  |  | +            apply_at = hub.timer.apply_at
 | 
	
		
			
				|  |  |              scheduled = hub.timer._queue
 | 
	
		
			
				|  |  |              transport = self.connection.transport
 | 
	
		
			
				|  |  |              on_poll_start = transport.on_poll_start
 | 
	
	
		
			
				|  | @@ -404,15 +407,36 @@ class Consumer(object):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              update_readers(self.connection.eventmap, self.pool.readers)
 | 
	
		
			
				|  |  |              for handler, interval in self.pool.timers.iteritems():
 | 
	
		
			
				|  |  | -                self.timer.apply_interval(interval * 1000.0, handler)
 | 
	
		
			
				|  |  | +                apply_interval(interval * 1000.0, handler)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            def on_process_up(w):
 | 
	
		
			
				|  |  | -                hub.add(w.sentinel, self.pool._pool.maintain_pool)
 | 
	
		
			
				|  |  | -            self.pool.on_process_up = on_process_up
 | 
	
		
			
				|  |  | +            def on_timeout_set(R, soft, hard):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            def on_process_down(w):
 | 
	
		
			
				|  |  | -                hub.remove(w.sentinel)
 | 
	
		
			
				|  |  | -            self.pool.on_process_down = on_process_down
 | 
	
		
			
				|  |  | +                def on_soft_timeout():
 | 
	
		
			
				|  |  | +                    if hard:
 | 
	
		
			
				|  |  | +                        R._tref = apply_at(time() + (hard - soft),
 | 
	
		
			
				|  |  | +                                        self.pool.on_hard_timeout, (R, ))
 | 
	
		
			
				|  |  | +                    self.pool.on_soft_timeout(R)
 | 
	
		
			
				|  |  | +                if soft:
 | 
	
		
			
				|  |  | +                    R._tref = apply_after(soft * 1000.0, on_soft_timeout)
 | 
	
		
			
				|  |  | +                elif hard:
 | 
	
		
			
				|  |  | +                    R._tref = apply_after(hard * 1000.0,
 | 
	
		
			
				|  |  | +                            self.pool_on_hard_timeout, (R, ))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            def on_timeout_cancel(result):
 | 
	
		
			
				|  |  | +                try:
 | 
	
		
			
				|  |  | +                    result._tref.cancel()
 | 
	
		
			
				|  |  | +                    delattr(result, "_tref")
 | 
	
		
			
				|  |  | +                except AttributeError:
 | 
	
		
			
				|  |  | +                    pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            self.pool.init_callbacks(
 | 
	
		
			
				|  |  | +                on_process_up=lambda w: hub.add_reader(w.sentinel,
 | 
	
		
			
				|  |  | +                    self.pool._pool.maintain_pool),
 | 
	
		
			
				|  |  | +                on_process_down=lambda w: hub.remove(w.sentinel),
 | 
	
		
			
				|  |  | +                on_timeout_set=on_timeout_set,
 | 
	
		
			
				|  |  | +                on_timeout_cancel=on_timeout_cancel,
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              transport.on_poll_init(hub.poller)
 | 
	
		
			
				|  |  |              self.task_consumer.callbacks = [on_task_received]
 | 
	
	
		
			
				|  | @@ -436,8 +460,8 @@ class Consumer(object):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  update_readers(on_poll_start())
 | 
	
		
			
				|  |  |                  if fdmap:
 | 
	
		
			
				|  |  | -                    for timeout in (time_to_sleep, 0.001):
 | 
	
		
			
				|  |  | -                        for fileno, event in poll(timeout) or ():
 | 
	
		
			
				|  |  | +                    #for timeout in (time_to_sleep, 0.001):
 | 
	
		
			
				|  |  | +                        for fileno, event in poll(time_to_sleep) or ():
 | 
	
		
			
				|  |  |                              try:
 | 
	
		
			
				|  |  |                                  fdmap[fileno](fileno, event)
 | 
	
		
			
				|  |  |                              except Empty:
 | 
	
	
		
			
				|  | @@ -445,8 +469,8 @@ class Consumer(object):
 | 
	
		
			
				|  |  |                              except socket.error:
 | 
	
		
			
				|  |  |                                  if self._state != CLOSE:  # pragma: no cover
 | 
	
		
			
				|  |  |                                      raise
 | 
	
		
			
				|  |  | -                        if buffer:
 | 
	
		
			
				|  |  | -                            flush_buffer()
 | 
	
		
			
				|  |  | +                        #if buffer:
 | 
	
		
			
				|  |  | +                        #    flush_buffer()
 | 
	
		
			
				|  |  |                  else:
 | 
	
		
			
				|  |  |                      sleep(min(time_to_sleep, 0.1))
 | 
	
		
			
				|  |  |  
 |