项目中经常使用多线程开发来提高运行速率,比如我们使用一个打印的功能,假如没有使用多线程,那么执行打印这个函数的任务就不会被分配,而是仅仅有该函数通过启用的主线程去执行。假如启用多线程,则会将该任务分配给启用的多个线程同时执行,所以在有必要的情况下,我们经常会选择使用多线程,来提高项目运行速率。
提示:关于多线程的讲解,上一篇文章 python 线程池 有具体的讲解
下面我们先来看一个小例子~
# -*- coding: utf-8 -*-
from collections import deque
import threadpool,threading,thread,time
import math
import datetime
'''
一个简单的例子:测试打印指定大小的队列中的数据,所用时间
'''
def print_number(printed_deque,wait_print_deque,lock):
# 从对列中取出一个数字进行打印
while len(wait_print_deque) !=0:
number = wait_print_deque.pop()
print "打印数字 : %s ,时间 : %s" % (number,time.ctime(time.time()))
lock.acquire() # 加上线程锁,避免多线程操作数据错乱
printed_deque.append(number)
lock.release() # 操作完变量, 线程锁释放
if __name__=="__main__":
time1 = datetime.datetime.now()
# 定义双向队列,指定长度大小 将需要打印的数字放在该对列
wait_print_deque=deque([i for i in xrange(1,10)],maxlen=10)
printed_deque=deque() #
lock = threading.Lock() # 线程锁
# # 定义双向队列,指定长度大小将打印过的数字重新组合到该队列中 像这种将要作为传入到多线程函数体中的变量,可以是队列或者列表,不要是字符串(容易被重写,数据丢失)
#
count= len(wait_print_deque) if len(wait_print_deque)<10 else 10
# 定义线程池的尺寸
pool = threadpool.ThreadPool(count)
parmgrams_dict = {'printed_deque':printed_deque,'wait_print_deque':wait_print_deque,'lock':lock}
requests = threadpool.makeRequests(print_number, [(None, parmgrams_dict), ])
[pool.putRequest(req) for req in requests]
pool.wait()