Python的多线程应用笔记

5 篇文章 0 订阅
3 篇文章 0 订阅

多线程的思路

一开始我认识到多线程的应用是在用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)

但是我发现需要注意的是:

使用多线程需要注意锁的获取,在程序中我尝试过使用线程锁,但是线程锁的限定会使程序变成单线程,并且有可能会出现线程的死锁。造成死锁程序会崩掉。

新人小白,欢迎各位莅临指导。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值