python 使用多线程开发 简单例子讲解

项目中经常使用多线程开发来提高运行速率,比如我们使用一个打印的功能,假如没有使用多线程,那么执行打印这个函数的任务就不会被分配,而是仅仅有该函数通过启用的主线程去执行。假如启用多线程,则会将该任务分配给启用的多个线程同时执行,所以在有必要的情况下,我们经常会选择使用多线程,来提高项目运行速率。
提示:关于多线程的讲解,上一篇文章 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()

你可能感兴趣的:(python 使用多线程开发 简单例子讲解)