多线程队列

作者:管理员 发布时间:2020-12-02 13:12

我们以前每个线程中,只跑一个函数,运行完成,这个线程就可以退休了。

但是社会险恶啊,同学们!

领导布置的任务往往没有那么简单,三个任务一套组合拳让你来完成,第一个任务还没完成,第四个任务,第五个任务就来了!

这一情况,笔者深受其害!但没办法,生活还是要继续,我们今天就来学习,如何把这一连串的任务让线程做好;


===============正文与代码===============


需借助python的Queue库来建立任务队列,

其建立队列有三种队列形式:

(1)Queue.Queue(maxsize)

这种是最常用的排队模式,采用先进先出制度,也是人们日常排队叫号的形势来的,每次get任务,都从最前面一个取。maxsize为一个队列最大接受的任务数。

(2)Queue.LifoQueue(maxsize)

这种队列采取,先进后出机制,就是永远有限处理最新进来的任务。应该用于处理紧急任务用的吧。

(3)Queue.PriorityQueue(maxsize)

最后的队列形式为自定义优先级,为优先级越高的越先出来,对于一个队列中的所有元素组成的entries,优先队列优先返回的一个元素是sorted(list(entries))[0]。至于对于一般的数据,优先队列取什么东西作为优先度要素进行判断,官方文档给出的建议是一个tuple如(priority, data),取priority作为优先度。

    import threading  
    import Queue  
    import time  
    class worker(threading.Thread):  
     def __init__(self,queue):  
      threading.Thread.__init__(self)  
      self.queue=queue  
      self.thread_stop=False  
       
     def run(self):  
      while not self.thread_stop:  #不干完活不许走 
       print("thread%d %s: waiting for tast" %(self.ident,self.name))  
       try:  
        task=q.get(block=True, timeout=20)#接收消息 ,从任务列表拿个活,如果没活就等20秒(从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有item出现为止来get出这个item。如果是False的话表明当队列为空你却去get的时候,会引发异常。在block为True的情况下可以再设置timeout参数。表示当队列为空,get阻塞timeout指定的秒数之后还没有get到的话就引发Full异常。)
       except Queue.Empty:  		#没等到活,就下班吧
        print("Nothing to do!i will go home!")  
        self.thread_stop=True  
        break  
       print("task recv:%s ,task No:%d" % (task[0],task[1]))  
       print("i am working")  
       time.sleep(3)  
       print("work finished!")  
       q.task_done()#完成一个任务  (告诉队列,这个活干完啦)
       res=q.qsize()#判断消息队列大小  
       if res>0:  	#咋还有任务没干完
        print("fuck!There are still %d tasks to do" % (res))  
       
     def stop(self):  
      self.thread_stop = True  
       
    if __name__ == "__main__":  
     q=Queue.Queue(3)  
     worker=worker(q)  
     worker.start()  
     q.put(["produce one cup!",1], block=True, timeout=None)#产生任务消息  
     q.put(["produce one desk!",2], block=True, timeout=None)  
     q.put(["produce one apple!",3], block=True, timeout=None)  
     q.put(["produce one banana!",4], block=True, timeout=None)  
     q.put(["produce one bag!",5], block=True, timeout=None)  
     print("***************leader:wait for finish!")  
     q.join()#等待所有任务完成  
     print("***************leader:all task finished!")


注意:woker类为一个自定义线程,后期封装、继承、多态相关课程中,会介绍更多相关支持。


标签:
Copyright © 2020 万物律动 旗下 AI算法狮 京ICP备20010037号-1
本站内容来源于网络开放内容的收集整理,并且仅供学习交流使用;
如有侵权,请联系删除相关内容;