mirror of https://github.com/peter4431/rq.git
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
| #!/usr/bin/env python
 | |
| # -*- coding: utf-8 -*-
 | |
| import os
 | |
| import time
 | |
| import optparse
 | |
| from rq import use_redis, Queue
 | |
| from rq.utils import gettermsize, make_colorizer
 | |
| 
 | |
| green = make_colorizer('darkgreen')
 | |
| 
 | |
| 
 | |
| def get_scale(x):
 | |
|     """Finds the lowest scale where x <= scale."""
 | |
|     scales = [20, 50, 100, 200, 400, 600, 800, 1000]
 | |
|     for scale in scales:
 | |
|         if x <= scale:
 | |
|             return scale
 | |
|     return x
 | |
| 
 | |
| 
 | |
| def parse_args():
 | |
|     parser = optparse.OptionParser()
 | |
|     parser.add_option('-q', '--queues', dest='subcmd',
 | |
|             action='store_const', const='queues',
 | |
|             help='Shows stats for queues.')
 | |
|     parser.add_option('-w', '--workers', dest='subcmd',
 | |
|             action='store_const', const='workers',
 | |
|             help='Shows stats for workers.')
 | |
|     parser.add_option('-n', '--interval', dest='interval',
 | |
|             type='float',
 | |
|             help='The interval between polls, in seconds.  Does not poll if 0.')
 | |
|     parser.add_option('-g', '--graph', dest='graph',
 | |
|             action='store_true', default=False,
 | |
|             help='Shows bar chart graphs where possible.')
 | |
|     opts, args = parser.parse_args()
 | |
|     return (opts, args, parser)
 | |
| 
 | |
| def show_queues(opts, args, parser):
 | |
|     while True:
 | |
|         if len(args):
 | |
|             qs = map(Queue, args)
 | |
|         else:
 | |
|             qs = Queue.all()
 | |
| 
 | |
|         num_jobs = 0
 | |
|         termwidth, _ = gettermsize()
 | |
|         chartwidth = min(20, termwidth - 20)
 | |
| 
 | |
|         max_count = 0
 | |
|         counts = dict()
 | |
|         for q in qs:
 | |
|             count = q.count
 | |
|             counts[q] = count
 | |
|             max_count = max(max_count, count)
 | |
|         scale = get_scale(max_count)
 | |
|         ratio = chartwidth * 1.0 / scale
 | |
| 
 | |
|         if opts.interval:
 | |
|             os.system('clear')
 | |
| 
 | |
|         print('scale = %d' % scale)
 | |
|         for q in qs:
 | |
|             count = counts[q]
 | |
|             if opts.graph:
 | |
|                 chart = green('|' + '█' * int(ratio * count))
 | |
|                 line = '%-12s %s %d' % (q.name, chart, count)
 | |
|             else:
 | |
|                 line = '%-12s %d' % (q.name, count)
 | |
|             print(line)
 | |
| 
 | |
|             num_jobs += count
 | |
|         print('%d queues, %d jobs total' % (len(qs), num_jobs))
 | |
| 
 | |
|         if opts.interval:
 | |
|             time.sleep(opts.interval)
 | |
|         else:
 | |
|             break
 | |
| 
 | |
| def show_workers(opts, args, parser):
 | |
|     raise NotImplementedError()
 | |
| 
 | |
| def main():
 | |
|     opts, args, parser = parse_args()
 | |
| 
 | |
|     if not opts.subcmd:
 | |
|         parser.error('Specify either --queues or --workers.')
 | |
| 
 | |
|     use_redis()
 | |
| 
 | |
|     if opts.subcmd == 'workers':
 | |
|         show_workers(opts, args, parser)
 | |
|     elif opts.subcmd == 'queues':
 | |
|         show_queues(opts, args, parser)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |