python 多线程读取列表(可以设置线程数,平均分配每个线程读取的列表数)

有的时候,我们需要快速的读取python的列表,如果是单线程就有点慢,最好就是开启多线程。但是如果线程数开多了,读取速度不仅没有加快,反而变慢了。所以我们需要控制线程数。还需要根据列表的大小,平均分配每个线程需要执行的列表区间。
根据要求,均益写好了这段代码,大家可自行设置行程数totalThread,和需要执行的列表listImg,至于读取这个列表的需求目的可以设置这个方法printImg。详细的代码看下面

 
# -*- coding: UTF-8 -*-
 
import threading
from time import sleep,ctime
 
class myThread (threading.Thread):
    def __init__(self, threadID, name, s , e):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.s = s
        self.e = e
    def run(self):
        print "Starting " + self.name+ctime()
       # 获得锁,成功获得锁定后返回True
       # 可选的timeout参数不填时将一直阻塞直到获得锁定
       # 否则超时后将返回False
        threadLock.acquire()
        #线程需要执行的方法
        printImg(self.s,self.e)
        # 释放锁
        threadLock.release()
 
listImg = [] #创建需要读取的列表,可以自行创建自己的列表
for i in range(179):
    listImg.append(i)
 
# 按照分配的区间,读取列表内容,需要其他功能在这个方法里设置
def printImg(s,e):
    for i in range(s,e):
        print i
 
 
totalThread = 3 #需要创建的线程数,可以控制线程的数量
 
lenList = len(listImg) #列表的总长度
gap = lenList / totalThread #列表分配到每个线程的执行数
 
threadLock = threading.Lock() #锁
threads = [] #创建线程列表
 
# 创建新线程和添加线程到列表
for i in range(totalThread):
    thread = 'thread%s' % i
    if i == 0:
        thread = myThread(0, "Thread-%s" % i, 0,gap)
    elif totalThread==i+1:
        thread = myThread(i, "Thread-%s" % i, i*gap,lenList)
    else:
        thread = myThread(i, "Thread-%s" % i, i*gap,(i+1)*gap)
    threads.append(thread) # 添加线程到列表
 
 
# 循环开启线程
for i in range(totalThread):
    threads[i].start()
 
 
# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"
Leave a Reply

Your email address will not be published. Required fields are marked *