<input id="2kyag"><button id="2kyag"></button></input>
  • <menu id="2kyag"><strong id="2kyag"></strong></menu>
  • <input id="2kyag"><tt id="2kyag"></tt></input><input id="2kyag"><u id="2kyag"></u></input>
    <menu id="2kyag"><u id="2kyag"></u></menu>
    <input id="2kyag"></input>
    <menu id="2kyag"><u id="2kyag"></u></menu><menu id="2kyag"></menu>
  • <input id="2kyag"><u id="2kyag"></u></input>

    day39

    python解释器

    Cpython

    基于C语言

    Jpython

    基于java

    Ppython

    基于Python

    GIL全局解释器锁

    基于Cpython来研究全局解释器锁。

    1.GIL本质上是一个互斥锁。

    2.GIL的为了阻止同一个进程内多个线程同时执行(并发)

    • 单个进程下的多个线程无法实现并行,但能实现并发

    3.这把锁主要是因为Cpython的内存管理不是“线程安全”的。

    ? 内存管理

    ? 垃圾回收机制

    GIL的存在就是为了 保证线程安全的

    注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,,交给下一个先进来的线程

    多线程的作用

    四个任务,计算密集型,每个任务需要10s:

    单核:

    开启进程

    消耗资源过大

    4个进程:40s

    开启线程

    消耗资源远小于进程

    4个线程:40s

    多核:

    开启进程

    并行执行,效率比较高

    4个进程:10s

    开启线程

    并发执行,执行效率低

    4个线程:40s

    四个任务,IO密集型,每个任务需要10s:

    单核:

    开启进程

    消耗资源过大

    4个进程:40s

    开启线程

    消耗资源远小于进程

    4个线程:40s

    多核:

    开启进程

    并行执行,效率小于多线程,因为遇到IO会立马切换CPU的执行权限

    4个进程:40s + 开启进程消耗的额外时间

    开启线程

    并发执行,执行效率高于多进程

    4个线程:40s

    总结:

    在计算密集型的情况下:使用多进程

    在IO密集型的情况下:使用多线程

    高效执行多个进程,内多个IO密集型的程序:使用 多进程 + 多线程

    死锁现象(了解)

    # 锁不能乱用
    from threading import Lock, Thread, current_thread
    import time
    
    mutex_a = Lock()
    mutex_b = Lock()
    #
    # print(id(mutex_a))
    # print(id(mutex_b))
    
    
    class MyThread(Thread):
    
        # 线程执行任务
        def run(self):
            self.func1()
            self.func2()
    
        def func1(self):
            mutex_a.acquire()
            # print(f'用户{current_thread().name}抢到锁a')
            print(f'用户{self.name}抢到锁a')
            mutex_b.acquire()
            print(f'用户{self.name}抢到锁b')
            mutex_b.release()
            print(f'用户{self.name}释放锁b')
            mutex_a.release()
            print(f'用户{self.name}释放锁a')
    
        def func2(self):
            mutex_b.acquire()
            print(f'用户{self.name}抢到锁b')
            # IO操作
            time.sleep(1)
    
            mutex_a.acquire()
            print(f'用户{self.name}抢到锁a')
            mutex_a.release()
            print(f'用户{self.name}释放锁a')
            mutex_b.release()
            print(f'用户{self.name}释放锁b')
    
    
    for line in range(10):
        t = MyThread()
        t.start()

    递归锁(了解)

    用于解决死锁问题

    RLock:比喻成万能哟啊哈斯,可以提供给多个人去使用。

    但是第一个使用的时候,会对该锁做一个引用计数。

    只有引用计数为0,才能真正释放让另一个人去使用

    from threading import RLock, Thread, Lock
    import time
    
    mutex_a = mutex_b = Lock()
    
    
    class MyThread(Thread):
    
        # 线程执行任务
        def run(self):
            self.func1()
            self.func2()
    
        def func1(self):
            mutex_a.acquire()
            # print(f'用户{current_thread().name}抢到锁a')
            print(f'用户{self.name}抢到锁a')
            mutex_b.acquire()
            print(f'用户{self.name}抢到锁b')
            mutex_b.release()
            print(f'用户{self.name}释放锁b')
            mutex_a.release()
            print(f'用户{self.name}释放锁a')
    
        def func2(self):
            mutex_b.acquire()
            print(f'用户{self.name}抢到锁b')
            # IO操作
            time.sleep(1)
            mutex_a.acquire()
            print(f'用户{self.name}抢到锁a')
            mutex_a.release()
            print(f'用户{self.name}释放锁a')
            mutex_b.release()
            print(f'用户{self.name}释放锁b')
    
    
    for line in range(10):
        t = MyThread()
        t.start()

    信号量(了解)

    互斥锁:

    比喻成一个家用马桶。

    同一时间只能让一个人去使用

    信号量:

    比喻成公厕多个马桶

    同一时间可以让多个人去使用

    from threading import Semaphore, Lock
    from threading import current_thread
    from threading import Thread
    import time
    
    sm = Semaphore(5)  # 5个马桶
    mutex = Lock()  # 5个马桶
    
    
    def task():
        # mutex.acquire()
        sm.acquire()
        print(f'{current_thread().name}执行任务')
        time.sleep(1)
        sm.release()
        # mutex.release()
    
    
    for line in range(20):
        t = Thread(target=task)
        t.start()

    线程队列

    线程Q(了解级别1):线程队列 面试会问:FIFO

    FIFO队列:先进先出

    LIFO队列:后进先出

    优先级队列:根据参数内,数字的大小进行分级,数字越小,优先级越高

    import queue
    
    # 普通的线程队列: 先进先出
    # q = queue.Queue()
    # q.put(1)
    # q.put(2)
    # q.put(3)
    # print(q.get())  # 1
    
    
    # LIFO队列: 后进先出
    # q = queue.LifoQueue()
    # q.put(1)
    # q.put(2)
    # q.put(3)
    # print(q.get())  # 3
    
    
    # 优先级队列
    q = queue.PriorityQueue()  # 超级了解
    # 若参数中传的是元组,会以元组中第一个数字参数为准
    q.put(('a优', '先', '娃娃头', 4))  # a==97
    q.put(('a先', '优', '娃娃头', 3))  # a==98
    q.put(('a级', '级', '娃娃头', 2))  # a==99
    '''
    1.首先根据第一个参数判断ascii表的数值大小
    2.判断第个参数中的汉字顺序.
    3.再判断第二参数中数字--> 字符串数字 ---> 中文
    4.以此类推
    '''
    print(q.get())
    相关文章
    相关标签/搜索
    4887王中王鉄算结小说 新蔡县| 文登市| 留坝县| 甘南县| 桂林市| 桐城市| 临泉县| 天长市| 沧州市| 五指山市| 客服| 平谷区| 河曲县| 如东县| 宣城市| 固安县| 晴隆县| 漾濞| 呼伦贝尔市| 昭觉县| 岑溪市| 沙河市| 炉霍县| 清苑县| 西林县| 蒙山县| 南安市| 梅河口市| 鹿泉市| 黄山市| 攀枝花市| 榆树市| 利辛县| 梅河口市| 延川县| 贺州市| 大石桥市| 高要市| 柏乡县| 宜君县| 延川县| 集安市| 白沙| 屯留县| 花垣县| 任丘市| 龙岩市| 交口县| 敖汉旗| 菏泽市| 鸡东县| 涿鹿县| 菏泽市| 孟州市| 四川省| 荔波县| 永顺县| 瑞丽市| 赤城县| 云霄县| 定襄县| 英吉沙县| 连山| 嘉荫县| 车险| 静海县| 伊川县| 承德县| 盱眙县| 济源市| 沙河市| 云和县| 雷波县| 阿坝县| 论坛| 呼图壁县| 景谷| 台南市| 四会市| 永春县| 花垣县| 象州县| 库车县| 左权县| 昌吉市| 井研县| 南康市| 繁昌县| 西城区| 武汉市| 武义县| 噶尔县| 龙海市| 韶关市| 伽师县| 新巴尔虎右旗| 边坝县| 灵武市| 元朗区| 曲阳县| 阿瓦提县| 新郑市| 牙克石市| 海晏县| 武陟县| 贞丰县| 龙海市| 彭阳县| 乌拉特中旗| 上饶市| 平果县| 龙海市| 平泉县| 上思县| 新建县| 东台市| 琼结县| 唐河县| 新津县| 定边县| 巴林右旗| 湘西| 晋宁县| 来凤县| 类乌齐县| 兰考县| 陆丰市| 崇阳县| 宜丰县| 新闻| 临夏市| 自贡市| 滨海县| 深圳市| 阿图什市| 太湖县| 石渠县| 永年县| 嘉荫县| 高邑县| 察隅县| 健康| 栖霞市| 延边| 河西区| 崇仁县| 阜南县| 儋州市| 邵武市| 渝北区| 武隆县| 广东省| 珠海市| 化德县| 鹤峰县| 阳春市| 衡东县| 昔阳县| 洛宁县| 三原县| 宿松县| 武城县| 阳山县| 亚东县| 颍上县| 肇东市| 清苑县| 扶风县| 桂平市| 宁安市| 顺义区| 张家界市| 县级市| 弋阳县| 耿马| 叶城县| 青铜峡市| 和龙市| 多伦县| 伊川县| 涟水县| 承德县| 陵川县| 宁武县| 红安县| 库伦旗| 成都市| 娄烦县| 揭东县| 阿拉善盟| 吕梁市| 舞钢市| 庆云县| 金寨县| 霍林郭勒市| 寿阳县| 达拉特旗| 潮安县| 沅江市| 二手房| 郸城县| 宣化县| 搜索| 遂宁市| 临洮县| 资讯| 三江| 八宿县| 丽江市| 万山特区| 黄山市| 南昌县| 铅山县| 方山县| 麻江县| 孝昌县| 乌兰县| 珠海市| 泾阳县| 奈曼旗| 新密市| 高要市| 邹平县| 长垣县| 磐石市| 江源县| 康保县| 康保县| 麻阳| 丹东市| 惠来县| 积石山| 岳阳市| 沙田区| 丰城市| 青岛市| 偃师市| 佛山市| 汉寿县| 聊城市| 汪清县| 祁门县| 望都县| 汉寿县| 沙雅县| 孟州市| 大理市| 丰原市| 文水县| 淄博市| 榕江县| 白朗县| 渭源县| 康保县| 军事| 云浮市| 仙游县| 长子县| 泸西县| 朝阳县| 神木县| 凤城市| 阿克陶县| 肇州县| 通州市| 荥阳市| 东莞市| 马山县| 德兴市| 灵璧县| 沽源县| 忻城县| 上虞市| 奉节县| 鹿泉市| 青岛市| 中超| 荥经县| 桃园市| 隆尧县| 明水县| 盘锦市| 石城县| 兴安县| 醴陵市| 南丰县| 镶黄旗| 平凉市| 芜湖县| 威远县| 大庆市| 清镇市| 攀枝花市| 剑川县| 房产| 任丘市| 河曲县| 通榆县| 扶余县| 安丘市| 仪征市| 微博| 平果县| 泰兴市| 阳山县| 景东| 柯坪县| 漳浦县| 会理县| 萨嘎县| 德钦县| 嘉峪关市| 德令哈市| 云阳县| 辰溪县| 斗六市| 满洲里市| 绥阳县| 梨树县| 大冶市| 积石山| 华容县| 邛崃市| 岗巴县| 柯坪县| 教育| 靖边县| 南岸区| 淄博市| 昌宁县| 邹城市| 迁西县| 杂多县| 江川县| 灵石县| 金川县| 密云县| 孟连| 永济市| 金门县| 鲁山县| 海宁市| 宁武县| 汉阴县| 安阳县| 盘锦市| 元阳县| 蒙阴县| 清水县| 巴彦淖尔市| 城口县| 仲巴县| 报价| 赤峰市| 龙岩市| 福建省| 丹阳市| 芜湖市| 兰溪市| 阜康市| 湛江市| 铁岭县| 个旧市| 太仓市| 左贡县| 平谷区| 博客| 若尔盖县| 开远市| 咸阳市| 江油市| 松潘县| 绥宁县| 和龙市| 本溪市| 嘉峪关市| 咸宁市| SHOW| 海林市| 苍梧县| 承德市| 文昌市| 贡觉县| 息烽县| 乐至县| 垣曲县| 化德县| 嵩明县| 洪雅县| 吉安县| 黔南| 东至县| 若羌县| 都昌县| 瓮安县| 迁安市| 英德市| 重庆市| 阿瓦提县| 兴隆县| 富阳市| 竹溪县| 长宁县| 永泰县| 澳门| 平塘县| 湛江市| 磴口县| 尼玛县| 桦甸市| 彭州市| 喜德县| 芷江| 子长县| 巩留县| 秀山| 葵青区| 通道| 沅江市| 全南县| 无极县| 达孜县| 南城县| 皋兰县| 获嘉县| 邯郸市| 广饶县| 灵丘县| 淮阳县| 宜良县| 田东县| 璧山县| 曲阜市| 新密市| 孝昌县| 贵州省| 炎陵县| 如皋市| 额敏县| 南漳县| 昌宁县| 河曲县| 太湖县| 滨州市| 辰溪县| 古蔺县| 鹤峰县| 湖北省| 栖霞市| 霍邱县| 镇江市| 南和县| 南丹县| 海兴县| 昭苏县| 溧水县| 北海市| 清远市| 秦皇岛市| 鄂托克前旗| 泸溪县| 遂宁市| 清镇市| 剑阁县| 桑植县| 阜南县| 邮箱| 临颍县| 奉贤区| 青河县| 电白县| 亚东县| 如皋市| 郧西县| 中超| 大丰市| 茌平县| 丘北县| 阿克陶县| 军事| 云阳县| 岳阳县| 穆棱市| 奎屯市| 六枝特区| 西青区| 镇原县| 肇源县| 日土县| 江阴市| 荆门市| 荣成市| 连云港市| 张家港市| 潢川县| 万安县| 汪清县| 辽阳县| 抚顺县| 本溪| 伊川县| 山阴县| 龙川县| 宝鸡市| 琼中| 铁岭县| 镇平县| 修武县| 桂平市| 美姑县| 沂水县| 绥阳县| 新乡市| 铜鼓县| 阳江市| 望江县| 汽车| 海安县| 剑阁县| 涞源县| 天长市| 蕲春县| 泸州市| 于田县| 花莲县| 历史| 遂宁市| 红安县| 金湖县| 德惠市| 绥化市| 富宁县| 屏南县| 万山特区| 宁晋县| 沛县| 延川县| 武乡县| 宝清县| 江永县| 衡阳县| 岳西县| 靖江市| 永春县| 丰镇市| 庄浪县| 罗田县| 探索| 南城县| 晋州市| 松溪县| 垫江县| 日土县| 松江区| 广元市| 甘洛县| 志丹县| 孝感市| 金湖县| 大同县| 乌鲁木齐市| 高雄市| 九寨沟县| 确山县| 黄大仙区| 蒲城县| 三明市| 南丹县| 曲靖市| 阿克苏市| 呼伦贝尔市| 成都市| 库车县| 南丰县| 鄂托克前旗| 缙云县| 巴楚县| 临澧县| 杭锦后旗| 若羌县| 内乡县| 工布江达县| 济南市| 额敏县| 济南市| 建水县| 唐海县| 潜山县| 高邑县| 张家川| 东安县| 乡城县| 潜江市| 瓦房店市| 白河县| 金华市| 塘沽区| 彭山县| 巴彦淖尔市| 陆良县| 波密县| 巍山| 磴口县| 青冈县| 安溪县| 庄河市| 阿克| 革吉县| 吉林市| 饶阳县| 香格里拉县| 西青区| 剑阁县| 内丘县| 绍兴市| http://www.jx1870cutv.fun http://wap.jx1870distancev.fun http://3g.jx1870costv.fun http://m.jx1870chancev.fun http://m.jx1870awardv.fun http://3g.jx1870careerv.fun http://m.jx1870containv.fun http://wap.jx1870dancev.fun http://3g.jx1870apparelv.fun http://m.jx1870defaultv.fun http://jx1870basev.fun http://m.jx1870budgetv.fun http://3g.jx1870balancev.fun http://jx1870askv.fun http://www.jx1870downloadv.fun http://3g.jx1870beatv.fun http://www.jx1870dezandv.fun http://wap.jx1870considerv.fun