速率限制队列
sloq的Python项目详细描述
一种较慢的队列实现,保证任务以最大速率处理。SlowQueue的目标是直接与队列API进行比较,以便可以将其作为另一个实现(与lifoqueue和priorityqueue一样)放入,但当前(不必如此)如果尝试将block=False或timeout>;0传递到get方法,则会引发额外的值错误。一些砰击是可能的,并且可以使用tokenbucket或slowqueue实例上的max\slam关键字参数进行控制。
有关更多信息,请参见以下示例(取自demo_sloq.py)或单元测试:
fromargparseimportArgumentParserfromthreadingimportThread,current_threadimportloggingimporttimefromsloqimportSlowQueuedefmain(args=None):prog=ArgumentParser()prog.add_argument("-n",type=int,default=10,metavar="TASK_COUNT",help="The number of tasks")prog.add_argument("-t",type=float,default=1,metavar="TASK_INTERVAL",help="The tick: seconds between tasks being released")prog.add_argument("-w",type=int,default=3,metavar="WORKER_COUNT",help="Number of workers")prog.add_argument("-d",type=float,default=0,metavar="TASK_DURATION",help="Duration of a single task")prog.add_argument("-s",type=float,default=0,metavar="MAX_SLAM",help="The maximum amount of slam to allow")args=prog.parse_args(args)logger=logging.getLogger(__name__)logger.setLevel(logging.INFO)logger.addHandler(logging.StreamHandler())test_queue(logger,args.t,args.n,args.d,args.w,args.s)deftest_queue(logger,tick=1,tasks=10,task_duration=0,worker_count=3,slam=0):start_time=time.time()sloq=SlowQueue(release_tick=tick,max_slam=slam)# Begin the workersforwinxrange(0,worker_count):Thread(target=test_worker,args=(logger,start_time,sloq)).start()# Populate the queuefortaskinxrange(0,tasks):sloq.put((task,task_duration))forwinxrange(0,worker_count):sloq.put((None,None))sloq.join()deftest_worker(logger,start_time,queue):whileTrue:task,sleep=queue.get()iftaskisNone:logger.info("%s, Done"%current_thread().name)queue.task_done()returnelse:logger.info("%s, Elapsed time: %0.2f, Task: %r",current_thread().name,time.time()-start_time,task)ifsleep:time.sleep(sleep)queue.task_done()if__name__=="__main__":main()