#列表均分问题,考虑到余数不确定,所以不可能全是绝对均分(只有余数为零才是)。余数怎么处理?
#解决思路:将余数均分到开始的部分等量中,形成(n+1)、(n+1)、...(n+1)、n、n、....n形式尽可能的均分。
# -*- coding: UTF-8 -*-
import time
import xlrd
import threading
#读电子表格
def rd_xls():
list1=[]
try:
xls=xlrd.open_workbook('C:/Users/Administrator/Desktop/sms/12345.xls')#打开表格
sheet=xls.sheet_by_index(0)#获取sheet
if sheet.row_len(2)!=2:
print(u'读表格错误, 请检查格式。')
return list1
for i in range(1,sheet.nrows):
list1+=sheet.row_values(i)
print(u'读取表格完毕!')
return list1
except:
print(u'读表格异常错误。')
def backup(list1):#定义线程带参函数
n=int(len(list1)/2)
print(u'共有',n,u'条。')
i=0
while i<n:
try:
print(list1[i*2])#这里输入第一列:ID
#print(list1[i*2+1])#这里输入第二列:内容
i+=1
except:
print(u'出现问题')
time_s=time.time()#计时开始
#读取表格数据为列表LIST
list1=rd_xls()
n=int(len(list1)/2)#列表为两列数据:ID+内容
if n==0:
exit(u'退出')
print(u'共有',n,u'条。')
#LIST均分进行多线程处理
thread_n=95##这里设置线程个数,列表均分数
remainder=n%thread_n#余数有几个
step1=n//thread_n+1#先长步,处理完余数
step2=n//thread_n
start2=remainder*step1#第二次循环起点
#以下分两步加入线程列表
thread_list=[]
for i in range(remainder):#先长步,处理完余数
list1_p=list1[step1*i*2:step1*(i+1)*2]
t=threading.Thread(target=backup,args=(list1_p,))
thread_list.append(t)
for i in range(thread_n-remainder):#再短步,处理完剩下的
list1_p=list1[(start2+step2*i)*2:(start2+step2*(i+1))*2]#要把新起点单独列项,再加
t=threading.Thread(target=backup,args=(list1_p,))
thread_list.append(t)
#线程运行
for t in thread_list:
t.setDaemon(True) # 设置为守护线程,不会因主线程结束而中断
t.start()
for t in thread_list:
t.join() # 子线程全部加入,主线程等所有子线程运行完毕
#backup(list1)
seconds=time.time()-time_s
print(u' ---------用时 '+str(int(seconds//60))+u' 分钟 '+str(int(seconds%60))+u' 秒。-------- ')
博客围绕列表均分问题展开,指出因余数不确定难以绝对均分,解决思路是将余数均分到开始部分等量中。还给出代码示例,通过读取电子表格数据形成列表,设置线程个数对列表进行均分,采用多线程处理,并记录处理用时。
2490

被折叠的 条评论
为什么被折叠?



