• day10-Python学习笔记(二十三)线程池,unittest参数化,协程


    线程池,unittest参数化,协程

    python的多线程只能利用cpu的一个核心,一个核心同时只能运行一个任务那么为什么你使用多线程的时候,它的确是比单线程快
    答:如果是一个计算为主的程序(专业一点称为CPU密集型程序),这一点确实是比较吃亏的,每个线程运行一遍,就相当于单线程再跑,甚至比单线程还要慢——CPU切换线程的上下文也是要有开销的。
    但是,如果是一个磁盘或网络为主的程序(IO密集型)就不同了。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,
    而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的,python的多线程就在这时候发挥作用了。比方说多线程网络传输,多线程往不同的目录写文件,等等。

    1、线程池就是为了防止无限启动很多线程,造成服务器压力大。
    2、协程
    就只有一个线程。
    异步IO
    例子:去排队买票,你在这给他说一下你要买票,等到你的时候 他会自动把票给你,节省你排队的时间。
    nginx
    1、从excel里面获取参数化数据


    import threading
    def say(lis):
    for i in lis:
    print(i)

    res = list(range(100))

    for i in range(5):
    t = threading.Thread(target=say,args=(res[i*20:(i+1)*20],))
    t.start()


    线程池
    # 放线程的一个池子
    import threadpool
    def say(num):
    print(num)

    res = list(range(101))
    pool = threadpool.ThreadPool(10)
    #创建一个线程池
    reqs = threadpool.makeRequests(say,res)#生成线程要执行的所有线程
    # for req in reqs:
    # pool.putRequest(req) #实际才去执行的
    [ pool.putRequest(req) for req in reqs]

    pool.wait() #等待 其他线程执行结束


    线程池封装
    import threadpool,asyncio
    class MyPool(object):
    def __init__(self,func,size=20,data=None):
    self.func = func
    self.size = size
    self.data = data
    def pool(self):
    pool = threadpool.ThreadPool(self.size)#创建一个线程池,指定大小
    reqs = threadpool.makeRequests(self.func,self.data)
    #生成请求,分配数据
    [pool.putRequest(req) for req in reqs]
    #执行函数
    pool.wait()
    #等待线程执行完成
    def down(num):
    print(num)
    my = MyPool(func=down,data=[1,2,3,4,5,6,7])
    my.pool()

    unittest参数化
    import unittest
    import nose_parameterized
    from ftl import DataToParam
    from MyLog import Logger
    def calc(a,b):
    a = int(a)
    b = int(b)
    res = round(a/b,2)
    print(res)
    return res

    class MyTest(unittest.TestCase):
    @nose_parameterized.parameterized.expand(DataToParam.text('case_data.txt'))
    def test_func(self,a,b,e):
    res = calc(a,b)
    self.assertEqual(res,int(e))

    if __name__ == '__main__':
    unittest.main()
     
    从文件里面获取参数化列表

    import os,xlrd
    class DataToParam(object):
    @classmethod
    def text(cls,filename,seq=','):
    cls.file_exist(filename)
    with open(filename,encoding='utf-8') as f:
    res = []
    for line in f:
    res.append(line.strip().split(seq))
    return res

    @classmethod
    def excel(cls,filename):
    cls.file_exist(filename)
    book = xlrd.open_workbook(filename) #打开excel
    sheet = book.sheet_by_index(0) #获取sheet页
    res = []
    for row in range(sheet.nrows): #sheet.nrows excel的行数
    line_list = sheet.row_values(row) #取excel里面的每一行数据,返回的是一个list
    res.append(line_list)
    return res

    @classmethod
    def file_exist(cls,filename):
    if os.path.isfile(filename):#判断文件是否存在
    return True
    raise Exception('参数化文件不存在!')
    # print(DataToParam.text('case_data.txt'))
    res = DataToParam.excel(r'C:UsersjniuhanyangDesktopdata.xlsx')
    print(res)
    # import json
    # print(json.dumps(res,indent=2))



  • 相关阅读:
    第三节:模板模式——在Spring框架应用
    第二节:模板模式——模板模式应用
    idea ---- intelij IDEA安装
    计算机基础 ---- 编码(er)
    preg_match一些问题
    php 两个值进行比较的问题
    php中in_array一些问题
    配置完php.ini中的扩展库后,重启apache出现错误1067
    基于Intel 174;E810 的OVS-DPDK VXLAN TUNNEL性能优化
    tc filter 工作模式:传统模式和 direct-action 模式
  • 原文地址:https://www.cnblogs.com/flynn0825/p/8552893.html
Copyright © 2020-2023  润新知