• python自动化测试-D9-学习笔记之二(多线程)


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


    '''
    import threading
    import time
    import requests

    def sayHi(name):
    time.sleep(2)
    print(name)
    def downHtml(url,name):
    conent = requests.get(url).content
    f=open(name+'.html','wb')
    f.write(conent)
    f.close()

    # for i in range(10):# 并行运行
    # t = threading.Thread(target=sayHi,args=('jason',)) # 启动一个线程,如果只有一个参数,后面要加逗号
    # t.start()

    urls =[
    ['nnzhp','http://www.nnzhp.cn'],
    ['baidu','http://www.baidu.com'],
    ['besttest','http://www.besttest.cn']
    ]

    start_time =time.time()
    # for url in urls:# 单线程
    # downHtml(url[1],url[0])

    threads = [] # 存放启动的子线程
    for url in urls:
    t = threading.Thread(target=downHtml,args=(url[1],url[0]))
    t.start()
    # t.join() # 主线程等待子线程结束
    threads.append(t)
    for t in threads: # 等待3个子线程 ,这样比把t.join写到上个循环里时间快了
    t.join()

    end_time = time.time()
    print(end_time-start_time) # 线程之间是互相独立的


    """
    如果多线程执行的函数有返回值(return),那么我们想获取结果的话,那么就把返回值
    写到一个list里,不能直接获取到return的返回值
    """
    import threading

    res = []

    # def lida(x,y):
    # return x+y

    def lida(x,y):
    res.append(x+y)

    for i in range(5):
    t=threading.Thread(target=lida,args=(i,i))# 函数有返回值,是不能直接获取到的
    t.start()

    print(res)


    一、线程&进程

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。进程是很多资源的集合。

    有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

    由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。线程是最小的执行单元,而进程由至少一个线程组成。

    我们在做事情的时候,一个人做是比较慢的,如果多个人一起来做的话,就比较快了,程序也是一样的,我们想运行的速度快一点的话,就得使用多进程,或者多线程,在python里面,多线程被很多人诟病,为什么呢,因为Python的解释器使用了GIL的一个叫全局解释器锁,它不能利用多核CPU,只能运行在一个cpu上面,但是你在运行程序的时候,看起来好像还是在一起运行的,是因为操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。这个叫做上下文切换。

    二、多线程,python中的多线程使用theading模块

    下面是一个简单多线程

    下面是另一种启动多线程的方式,继承式

    这两种方式没有什么区别,两种写法而已,我个人喜欢用第一种,更简单一些。

    线程等待,多线程在运行的时候,每个线程都是独立运行的,不受其他的线程干扰,如果想在哪个线程运行完之后,再做其他操作的话,就得等待它完成,那怎么等待呢,使用join,等待线程结束

    守护线程,什么是守护线程呢,就相当于你是一个国王(非守护线程),然后你有很多仆人(守护线程),这些仆人都是为你服务的,一但你死了,那么你的仆人都给你陪葬。

    线程锁,线程锁就是,很多线程一起在操作一个数据的时候,可能会有问题,就要把这个数据加个锁,同一时间只能有一个线程操作这个数据。

    下面来个简单的爬虫,看下多线程的效果

    三、多进程,上面说了Python里面的多线程,是不能利用多核CPU的,如果想利用多核CPU的话,就得使用多进程,python中多进程使用multiprocessing模块。

  • 相关阅读:
    jquery实现记住用户名和密码
    从mysql8.0.15升级到8.0.16
    mysql8.0.15二进制安装
    DML、DDL、DCL的分别是什么
    redis3.2.10单实例安装测试
    redis5.0.3单实例简单安装记录
    percona-xtrabackup快速安装及其简单使用
    pt-show-grants的用法
    Centos6安装Percona-tools工具
    sshpass-Linux命令之非交互SSH密码验证
  • 原文地址:https://www.cnblogs.com/blackbird0423/p/8543311.html
Copyright © 2020-2023  润新知