python 使用队列实现线程池

#-*- coding: utf-8 -*-
'''
Created on 2019��1��1��

@author: Administrator
'''
import Queue
import threading
from time import sleep
taskQueue = Queue.Queue()
def worker(fun):
    while True:
        temp = taskQueue.get()
        fun(temp)
        taskQueue.task_done()
def threadPool(threadPoolNum):
    threadPool = []
    for i in xrange(threadPoolNum):
        thread = threading.Thread(target=worker,args={doFun,})
#         设置为守护线程,当主线程退出后,守护线程也会退出。如果不设置成守护线程,线程将因为执行的是死循环而无法退出
#         主线程将阻塞与子线程
        thread.daemon = True
        threadPool.append(thread)
    return threadPool

def doFun(param):
    print '%s execute %s' % (threading.current_thread(),param)
if __name__ == '__main__':
    pool1 = threadPool(3)
    for i in xrange(pool1.__len__()):
#         可以先启动线程,因为如果任务队列taskQueue为空时,调用get()函数是会阻塞
        pool1[i].start()
    for i in xrange(10):
        taskQueue.put(i)
#          队列调用的join函数,任何加入队列项都是是计数加一,对于任何子线程只要调用task_done()函数都会
#          使计数减一,但未完成任务的计数减为0时,join函数就不会阻塞.初始计数为0
    taskQueue.join()
    pass
<Thread(Thread-1, started daemon 7632)> execute 0
<Thread(Thread-2, started daemon 1372)> execute 1
<Thread(Thread-3, started daemon 7500)> execute 2
<Thread(Thread-1, started daemon 7632)> execute 3
<Thread(Thread-2, started daemon 1372)> execute 4
<Thread(Thread-3, started daemon 7500)> execute 5
<Thread(Thread-1, started daemon 7632)> execute 6
<Thread(Thread-2, started daemon 1372)> execute 7
<Thread(Thread-1, started daemon 7632)> execute 8
<Thread(Thread-2, started daemon 1372)> execute 9

二、改进版 线程池执行不同的任务

#-*- coding: utf-8 -*-
'''
Created on 2019��1��1��

@author: Administrator
'''
import Queue
import threading
from time import sleep
taskQueue = Queue.Queue()
def worker():
    while True:
        dofun,params = taskQueue.get()
        dofun(params)
        taskQueue.task_done()
def threadPool(threadPoolNum):
    threadPool = []
    for i in xrange(threadPoolNum):
        thread = threading.Thread(target=worker)
#         设置为守护线程,当主线程退出后,守护线程也会退出。如果不设置成守护线程,线程将因为执行的是死循环而无法退出
#         主线程将阻塞与子线程
        thread.daemon = True
        threadPool.append(thread)
    return threadPool

def doFun1(params):
    print '%s execute doFun1' % (threading.current_thread().getName())
    print params[0]
    print params[1]
def doFun2(params):
    print '%s execute doFun2' % (threading.current_thread().getName())
if __name__ == '__main__':
    pool1 = threadPool(3)
    for i in xrange(pool1.__len__()):
#         可以先启动线程,因为如果任务队列taskQueue为空时,调用get()函数是会阻塞
        pool1[i].start()
    params = ('az1','true')
    for i in xrange(5):    
        taskQueue.put((doFun1,params))
    params = ()
    for i in xrange(5):    
        taskQueue.put((doFun2,params))
    
#          队列调用的join函数,任何加入队列项都是是计数加一,对于任何子线程只要调用task_done()函数都会
#          使计数减一,但未完成任务的计数减为0时,join函数就不会阻塞.初始计数为0
    taskQueue.join()
    pass

Thread-1 execute doFun1
Thread-2 execute doFun1
Thread-3 execute doFun1
Thread-1 execute doFun1
Thread-2 execute doFun1
Thread-2 execute doFun2
Thread-2 execute doFun2
Thread-1 execute doFun2
Thread-3 execute doFun2
Thread-2 execute doFun2

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值