多线程的思路
一开始我认识到多线程的应用是在用wxpython的时候,不同的按钮允许在同时运行的情况
现在的目的是需要在一个类中同时运行五种不同的运算方式,然后汇总得到结果;
应用:使用多线程threading和继承,重写类方法的方式进行不同运算方式,同时运算得到结果。
汇总的结果我是通过一个列表list的方式储存,然后调用继承的方法write_excel()
一开始我尝试过直接写入,但是利用xlsxwriter直接写入,会发生一些问题,比如由于是多线程写入,每个线程都是独立的,每个线程都可以写入,在极少量数据进行运算的时候是可以写入的(因为python的多线程并不是完全是同时启动的,是有分先后顺寻的,但是这是一种不稳定的写入方式),由于利用xlsxwriter进行对excel的写入操作只可针对一个excel而且一次就只能对一个excel进行操作。如果进行同时进行写入的话会造成excel文件的损坏。同时这种方法进行运算是存在缺点的,这个计算时间会由时间最长的一个计算方式所决定的,对于有部分计算方式时间较长就没有多大的优势。
在write_excel()方法中判断是否满足要写入excel的条件(我的条件是大于等于5个,由于是拥有了五种计算结果)
使用的多线程进行运算的例子:
from threading import Thread
class casualAnalysis:#(Thread)
def __init__(self,filepath,outputfilepath,outputb):
# Thread.__init__(self)
self.filepath=filepath
self.outputfilepath=outputfilepath
self.outputb=outputb
# self.start()
def casualanalysis(self):
for i in [CasualBuAnalysis(filepath=self.filepath,outputfilepath=self.outputfilepath,outputb=self.outputb),NoneDocCount(filepath=self.filepath,outputfilepath=self.outputfilepath,outputb=self.outputb)]:
# for i in [CasualBuAnalysis(),NoneDocCount()]:
self.casual=i
# yield self.casual
def run(self):
print("aa")
self.casualanalysis()
print("bb")
class CasualBuAnalysis(Thread):
def __init__(self,**kwargs):
Thread.__init__(self)
self.filepath=kwargs['filepath']
self.outputfilepath=kwargs['outputfilepath']
self.outputb=kwargs['outputb']
self.start()
def casualanalysis(self):
# wx.MessageBox("buanalysis")
for i in range(10):
print("buanalysis")
def run(self):
self.casualanalysis()
class NoneDocCount(CasualBuAnalysis):#继承了CasualBuAnalysis的方法和属性及其变量
# print("2")
def casualanalysis(self):
print("self.filepath:%s"%self.filepath)
# wx.MessageBox("nonedocananlysis")
for i in range(10):
print("nonedocananlysis")
if __name__=='__main__':
casualAnalysis("1","2","3").run()
上面的方法通过重构function的方式,改写计算方法,达到方法的重用,但是对于汇总上面存在的问题还是要有待解决的。
我的想法上通过把结果输出到不同的sheet中去。
至于整合到同一个sheet中可以发现有些时候我们可以
*args可以传入列表,元组。**kwargs可以传入字典作为参数,需带有‘关键字=’。
具体实现如下:
from threading import Thread
import xlsxwriter
import threading
from threading import Lock
result=[]
res=[]
class casualAnalysis:
def __init__(self,filepath,worksheet,outputb):
global result
self.filepath=filepath
self.worksheet=worksheet
self.outputb=outputb
def casualanalysis(self):
count=0
ovj= iter([CasualBuAnalysis(filepath=self.filepath,worksheet=self.worksheet,outputb=self.outputb),NoneDocCount(filepath=self.filepath,worksheet=self.worksheet,outputb=self.outputb),NoneDocCount1(filepath=self.filepath,worksheet=self.worksheet,outputb=self.outputb)])
print("over")
def run(self):
print("aa")
self.casualanalysis()
class CasualBuAnalysis(Thread):
local_result=threading.local()
def __init__(self,**kwargs):
global res
Thread.__init__(self)
self.filepath=kwargs['filepath']
self.worksheet=kwargs['worksheet']
self.outputb=kwargs['outputb']
self.start()
def casualreport(self):
for i in range(50):
print("buanalysis")
result={"a":0,"b":0,"c":0}
title = ['Team', '任务统计数量']
res.append(result)
self.write_excel(local_result.result,'Non-eDoc Counting',title,flag=2)
def write_excel(self,single,label,title,flag):
result.append(single)
print(label)
if len(result)>=5:
countrow=1
#write....
nnum=len(single.keys())
cnum = len(title)
bu=list(single.keys())
self.worksheet.write(0, flag,label)
for b in range(cnum):
self.worksheet.write(countrow,b+flag,title[b])
for r in range(nnum):
countrow += 1
self.worksheet.write(countrow, flag, bu[r])
self.worksheet.write(countrow, flag+1, single[bu[r]])
print("there")
def run(self):
return self.casualanalysis()
class NoneDocCount(CasualBuAnalysis):
def casualanalysis(self):
print("self.filepath:%s"%self.filepath)
for i in range(51):
print("nonedocananlysis")
result={"a":2,"b":2,"c":2,"d":2,"e":2,"g":2}
title = ['Team', '任务统计数量']
res.append(result)
self.write_excel(result,'Non-eDoc Counting',title,flag=4)
class NoneDocCount1(CasualBuAnalysis):
def casualanalysis(self):
global local_result
print("self.filepath:%s"%self.filepath)
for i in range(50):
print("nonedocananlysis")
result={"a":2,"b":2,"c":2,"d":2,"e":2,"g":2}
title = ['Team', '任务统计数量']
res.append(result)
self.write_excel(result,'Non-eDoc Counting',title,flag=6)
if __name__=='__main__':
with xlsxwriter.Workbook(r'C:\Users\GZTSALFIEL\Desktop\excel问题文件\1234.xlsx') as workbook:
worksheet = workbook.add_worksheet("counting")
casualAnalysis("1",worksheet,"3").run()
workbook.close()
print(res)
但是我发现需要注意的是:
使用多线程需要注意锁的获取,在程序中我尝试过使用线程锁,但是线程锁的限定会使程序变成单线程,并且有可能会出现线程的死锁。造成死锁程序会崩掉。
新人小白,欢迎各位莅临指导。