python 多线程+queue

发布时间:2019-09-13 09:27:24编辑:auto阅读(1491)

    python的queue设计的是线程安全的,所以大家伙放心用吧!
    python多线程的一种简单的实现如下:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import threading
    import time
    
    def fun(argv):
        print 'in', argv
        time.sleep(2)
    
    threads = []    #用于保存线程
    for i in range(5):  #开5个线程
        t = threading.Thread(target = fun, args = str(i))
        threads.append(t)
    
    if __name__ == '__main__':
        #开始所有的线程
        for i in threads:
            i.start()
        #保证线程执行完    
        for i in threads:
            i.join()
        print 'all over'
    

    程序执行结果如下
    这里写图片描述
    使用threading可以很容易的开启多线程,join的作用是用于线程同步,看自己的需求而定。
    好了,现在进入正题,多线程+queue怎么弄,先给出代码

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import Queue
    import threading
    import time
    
    Thread_id = 1
    Thread_num = 3
    class myThread(threading.Thread):
        def __init__(self, q):
            global Thread_id
            threading.Thread.__init__(self)
            self.q = q
            self.Thread_id = Thread_id
            Thread_id = Thread_id + 1
        def run(self):
            while True:
                try:
                    task = self.q.get(block = True, timeout = 1) #不设置阻塞的话会一直去尝试获取资源
                except Queue.Empty:
                    print 'Thread' ,  self.Thread_id , 'end'
                    break
                #取到数据,开始处理(依据需求加处理代码)
                print "Starting " , self.Thread_id
                print task
                self.q.task_done()
                print "Ending " , self.Thread_id
    
    
    q = Queue.Queue(10)
    
    #向资源池里面放10个数用作测试
    for i in range(10):
        q.put(i)
    
    #开Thread_num个线程 
    for i in range(0, Thread_num):
        worker = myThread(q)
        worker.start()
    q.join() #等待所有的队列资源都用完
    print "Exiting Main Thread"
    
    

    结果如下
    这里写图片描述
    是不是感觉很乱,哈哈没关系,这才是多线程的魅力所在!你永远不知道是从哪个线程开始。
    在这里Queue作为资源池,线程去从资源池中取数据进行处理,可是为什么需要用到Queue呢, 因为可能资源池很大,而开的线程数有限,所以等一个线程处理完它的任务之后,它可以继续去取资源处理!这就可以让先执行完一个任务的线程不立即停下来,而是去取另一个资源处理,直到没有数据的时候它才会停下来。简单理解:q.task_done是表明当前的资源处理完了,q.join()会等到所有的资源都被处理了才会向下继续执行,这就是一种同步。

关键字