zoukankan      html  css  js  c++  java
  • python_day27__线程和进程_threading模块_


    #Author:'haijing'
    #date:2018/11/18

    # 只有操作系统(os)才可以去调动cpu、硬盘等
    # 以前写的每一个.py文件就是一个进程,这个进程中只有一个主线程
    #比如qq就是一个进程,qq这个进程中有很多的功能,
    #线程是可以资源共享的(共享cpu的资源),但是进程是不可以资源共享的,比如360收不到qq消息
    #能让操作系统工作起来的最小单位就是线程
    #自己写的一个py文件中的一堆指令,就是一个线程。这堆指令被执行的时候,就调度了cpu
    #或一个指令集就是一个线程
    #只有一个cpu的话去执行多个程序,方法是以很快的速度去切换,用户是感受不到这个速度的,但是切换也是会有耽误时间的
    #I/O密集型任务或函数(多用多线程,因为有阻塞的状态)
    #计算密集型任务或函数(少用多线程,因为就是去计算,而且切换也是会有时间损耗)

    #以下整体就是一个进程,这个进程包括了3个线程:一个主进程、两个子进程
    #进程是线程资源的集合
    #进程和线程执行速度是一样的,执行线程和执行进程是在执行同样的东西
    import time
    import threading #多线程模块

    #I/O密集型 适合用多线程 因为有阻塞,比如time.sleep(1)就是一个阻塞
    # begin = time.time() #主线程
    # def foo(a):
    # print('foo:%s' %a)
    # time.sleep(1) #睡1秒钟 相当于I/O阻塞,那么cpu切换到别的子线程中去执行,如果都阻塞住,那么cpu就休息了
    # print('end foo')
    #
    # def bar(a):
    # print('bar:%s' %a)
    # time.sleep(2) #睡1秒钟 不占用cpu,此时cpu就会执行别的子线程或者主线程
    # print('end bar')
    #
    # t1 = threading.Thread(target=foo,args=(1,)) #创建了一个子线程对象t1,相当于foo(1) *****
    # t1.start() #子线程执行 *****
    # t2 = threading.Thread(target=bar,args=(2,)) #创建了一个子线程对象t2,相当于bar(2) *****
    # t2.start() #子线程执行 *****
    #
    # end = time.time() #主线程
    # print(end-begin) #打印程序执行的时间 #主线程
    #子线程和主线程是并驾齐驱的,同时执行 谁快谁慢 是抢占式的
    #至于同时显示(主线程和子线程)程序执行的结果,是因为切换的速度快,也就是说,在一个时刻,也是只有一条代码在执行,即使是有子线程和主线程,只不过在某条程序有阻塞的时候会去执行别的子线程

    #而子线程中的其余的程序也是一起执行的,线程之间可以数据共享,进程不可以(但是可以通过队列等进行通信)

    #Cpython中有一个解释器锁GIL,表示在同一时刻,只能有一个线程,如果有多个线程,那么就会去竞争
    #因为有了GIL,所以多核cpu也没用了
    #GIL是不让一个进程中的多个线程同时跑,但是让多个进程同时跑,每个进程分配每个cpu即可

    # foo(1)
    # bar(2) #这样执行是串行执行代码
    #并行是好几个cpu同时在工作

    #阻塞:比如上次的程序中的等待客户端来连接服务端就是一个阻塞

    #计算密集型 不适合用多线程 因为总是要执行完所有的计算过程的,而且计算过程肯定是没有阻塞的
    # begin = time.time()
    def add(n):
    sum = 0
    for i in range(n):
    sum += i
    print(sum)
    # add(1000000)
    # add(2000000)
    #
    # end = time.time()
    # print(end-begin)

    begin = time.time()
    t3 = threading.Thread(target=add,args=(1000000,))
    t3.start()
    t4 = threading.Thread(target=add,args=(2000000,))
    t4.start()

    end = time.time()
    print(end-begin)

    # 结论:在python中
    # if 任务是IO密集型的 可以用多线程
    # if 任务是计算密集型的 改用c语言

    #join:谁调用join,谁就阻塞住,如t1.join()表示如果t1没有执行完,其余的谁也不能去执行,其实就是串行,没有多大的意义
    # for t in thread: #假如thread=[t1,t2]
    # t.start()
    # t.join() #不在for循环内时,这一句等价于t2.join()

    #Daemon: t1.setDaemon(True)设置守护线程,只要是主线程结束了,那么t1子线程也立马结束,其余线程正常执行

    print(threading.current_thread()) #打印当前执行的线程
    print(threading.active_count()) #打印没有结束的线程

    #注:Cpython是用c语言写的python解释器


    图 多进程解决Cpyton中的GIL问题

    最近特别的想回家,不知道是为什么,刚刚三点的时候和我妹妹微信语音了大概三十多分钟,主要是给她说了一下这次期中考试的事情,别的顺带的问了一下,
    知道我爸在干什么,我妈在干什么,就很知足了,最重要的是不想再让我爸妈那么的辛苦了;我知道最近家里在盖浴室,爸妈肯定都累坏了。

      我知道目前我还不是能够让我爸妈引以为豪的儿子,以后可能会慢慢标号的吧。
      现在在听beyond的大地,其中有一句评论:我离天空最高的一次,是你把我高高的举过了你的肩头。
                                        haijing in HZ
                                        2018.11.18 周末 傍晚 雨






  • 相关阅读:
    tcpdump命令
    浅谈  curl命令
    MongoDB下rs.status()命令
    Device mapper存储方式
    top命令
    cat命令汇总整理
    centos7搭建nginx日志
    CentOS7 防火墙(firewall)的操作命令(转)
    服务器的硬件组成
    shell随机生成10个文件
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/9978381.html
Copyright © 2011-2022 走看看