• Python基础笔记:线程与进程


    守护进程

    from threading import Thread
    import time
    import os
    def task(name):
        print('%s is running ' % name)
        time.sleep(1)
        print('%s is over ' % name)
    
    def test():
        time.sleep(3)
        print('over')
    
    if __name__ == '__main__':
        t = Thread(target=task,args=('lichang',))
        test = Thread(target=test)
    
        t.daemon = True # 开启守护线程
        t.start()
        test.start()
        print('主')
    

    线程互斥锁

    from threading import Thread, Lock
    import time
    money = 100
    mutex = Lock()
    def task():
        global money
        mutex.acquire()
        tmp = money
        time.sleep(0.1)
        money = tmp - 1
        mutex.release()
    
    if __name__ == '__main__':
        # mutex = Lock()
    
        t_list = []
    
        for i in range(100):
            t = Thread(target=task)
            t.start()
            t_list.append(t)
    
        for t in t_list:
            t.join()
        print(money)
    
    '''数据错乱,加锁处理'''
    

    GIL全局解释锁

    Python解释器有多个版本
    普遍使用的是Cpython

    1. GIL不是Python的特点而是Cpython的特点
    2. GIL是保证解释器级别的数据安全
    3. GIL会导致同一个进程下的多个线程无法同时运行
    4. 针对不同的数据还是需要不同的锁处理
    5. 解释型语言的通病:同一个进程下多个线程无法利用多核优势

    在cpython解释器中GIL是一把互斥锁,用来阻止同一个进程下的多个线程的同时执行

    同一个进程下的多个线程无法利用多核优势

    Python的多线程是不是没有什么用?

    因为Cpython中的内存管理不是线程安全的
    内存管理(垃圾回收机制)

    • 应用计数
    • 标记清除
    • 分代回收

    同一进程下的多线程无法利用多核优势,是不是就没什么用

    多线程是否有用要看具体情况
    多进程:相对浪费资源
    多线程:更加节省资源
    IO密集型计算密集型
    IO密集型条件下使用多线程效率更高
    计算密集型条件下使用多进程效率更高
    
    多进程和多线程都有各自的优势
    并且在实战写项目时通常可以:多线程下面再开设多线程
    
    

    总结

    • 开启进程的两种方式
    开进程和开线程的步骤基本是一样的,只是导入的模块不一样而已
    开进程代码必须写在main下面,而开进程则无需这么做
    
    类的对象调用方法
    类的继承重写Run方法
    
    • TCP服务端实现并发
    将接客与服务的活分开
    
    • 线程对象的join方法
    等待当前线程对象结束之后,再继续往下执行
    
    • 同一个进程内的多个线程数据是共享的
    同一个进程内可以开设多个线程
    进程:资源单位
    线程:执行单位
    
    • 线程对象属性和方法
    current_thread
    active_count    当前活跃的线程
    
    • 守护线程
    主线程必须等待所有非守护线程的结束才能结束
    t.daemon = True
    t.start()
    
    • 线程互斥锁
    当多个线程在操作同一份数据的时候可能会造成数据的错乱
    这时为了保证数据的安全,我们通常会加锁处理
    锁:
        将并发变成串行,降低了程序的运行效率但是保证了数据的安全
    一般不会遇到锁的问题,底层封装已处理
    
    • GIL全局解释器锁
    1. GIL不是Python的特点而是Cpython的特点
    2. GIL本身也是一把互斥锁,但是它是解释器级别的
    3. 它的存在是因为Cpython解释器内存管理不是线程安全
        垃圾回收机制
            - 应用计数
            - 标记清除
            - 分代回收
    4. 也就意味着GIL的存在导致了同一个进程下的多个线程无法利用多核优势(不能同时运行)
    5. 针对不同的数据应该加不同的锁来保证安全
    
    • python多线程是否有用
    结合任务的具体类型再做判断
    应该对任务分两种情况讨论
    IO密集型
        多线程更加节省资源
    计算密集型
        多进程更加合理
    多进程和多线程均有用,且后面的操作都是多进程加多线程从而达到效率最大化
    
  • 相关阅读:
    javascript检测浏览器插件
    登陆注册数据库设计与任务分配
    做网站的一些定律原理和效应
    为什么我们应该像盖房子那样写程序?
    最近项目中遇到的一些设计问题
    反向代理缓存
    《你必须知道的.NET》读书笔记
    锋利的Jquery读书笔记
    将pdf转成jpg格式
    《你必须知道的.NET》第五章读书笔记
  • 原文地址:https://www.cnblogs.com/pr1s0n/p/13441470.html
Copyright © 2020-2023  润新知