zoukankan      html  css  js  c++  java
  • 线程理论

    一、什么是进程?

    进程是:

      1、计算机中最小的资源分配单位

      2、进程对操作系统来说还是有一定负担

      3、创建一个进程 错做系统要分配的资源大致有:

            # 代码
    # 数据
    # 文件
    二、什么是线程?

    线程是:

      1、线程是计算机中被cpu调度的最小单位

      2、你的计算机当中的cpu都是执行的线程中的代码
    三、为什么要有线程?

    1、轻量级的概念

    2、他没有属于自己的进程资源:一条线程只负责执行代码,没有自己独立的代码、变量、文件资源
    四 、线程与进程之间的关系
         1、每一个进程中都有至少一条线程在工作

    五、进程与线程之间的区别
         1、占用的资源共享
    2、调度的效率
    3、资源是否共享

    六、线程的特点
         1、同一个进程中的所有线程的资源是共享的
    2、轻量级 没有自己的资源
    七、python 中的线程
        1、一个进程中的多个线程能够并行么?不行
    python是一个解释型语言
    为什么不行?
    Cpython解释器 内部有一把全局解释器锁 GIL
    所以线程不能充分的利用多核
    同一时刻用一个进程中的线程只有一个能被cpu执行
    GIL锁 缺实时限制了你的程序效率
    GIL锁 目前 是能够帮助你在线程的切换中提高效率
    2、 是不是python 就没有前途
    cpu -- 计算型
    web 爬虫 金融分析(基本在IO等待中)
    3、就是想写高计算型
    开启多进程
    换一个解释器,pypy jpy

    八、线程的并发
    import os
    import time
    from threading import Thread
    def func(i):
        time.sleep(1)
        print('zi',i,os.getpid())
    print('zhu', os.getpid())
    for i in range(10):
        t1 = Thread(target=func,args=(i,))
        t1.start()
    九、线程的轻量级
    import os
    import time
    from threading import Thread
    from multiprocessing import Process
    def func(i):
        print('zi',i,os.getpid())
    if __name__ == '__main__':
        start = time.time()
        t_lst = []
        for i in range(100):
            t = Thread(target=func,args=(i,))
            t.start()
            t_lst.append(t)
        for t in t_lst:t.join()
        tt = time.time() - start
    
        start = time.time()
        t_lst = []
        for i in range(100):
            t = Process(target=func, args=(i,))
            t.start()
            t_lst.append(t)
        for t in t_lst: t.join()
        pt = time.time() - start
        print(tt,pt)
    结果为:
    0.018921375274658203 4.373299598693848

    十、线程的数据共享

    from threading import Thread
    num = 100
    def func():
        global num
        num -=1
    t_lst = []
    for i in range(100):
        t = Thread(target=func)
        t.start()
        t_lst.append(t)
    for t in t_lst: t.join()
    print(num)
    结果为:
    0

    十一、守护线程

    import time
    from threading import Thread
    def func1():
        while True:
            time.sleep(0.5)
            print(123)
    def func2():
        print('func2 start')
        time.sleep(3)
        print('func2 end')
    t1 = Thread(target=func1)
    t2 = Thread(target=func2)
    t1.setDaemon(True)
    t1.start()
    t2.start()
    print('主线程的代码结束')

    守护线程的特点:

    1、守护线程 是在主线程代码结束之后,还在等待了子线程执行结束才结束
    2、主线程结束 就意味着主进程结束
    3、主线程等待所有的线程结束
    4、主线程结束了之后,守护线程随着主进程的结束自然结束了


  • 相关阅读:
    搭建GIT服务器
    TCP/IP原理简述
    GIT使用—补丁与钩子
    GIT使用—创建并使用远程版本库
    Tomcat的工作模式和运行模式
    GIT使用—分支与合并
    GIT使用—提交的查找与变更
    南京理工大学
    学习(踩坑)记录——新建工程
    2018一年总结
  • 原文地址:https://www.cnblogs.com/youhongliang/p/9700938.html
Copyright © 2011-2022 走看看