<input id="y8oc4"><u id="y8oc4"></u></input>
<menu id="y8oc4"></menu>
  • <input id="y8oc4"><u id="y8oc4"></u></input>
    <input id="y8oc4"><tt id="y8oc4"></tt></input>
  • <input id="y8oc4"><u id="y8oc4"></u></input>
    <menu id="y8oc4"></menu><input id="y8oc4"></input>
    <input id="y8oc4"><u id="y8oc4"></u></input>
    <input id="y8oc4"><u id="y8oc4"></u></input>
    <input id="y8oc4"></input>
  • 进程队列补充、socket实现服务器并发、线程完结

    1.队列补充

    队列内部是管道+锁(数据在队列中是阻塞的)

    2.关于python并发与并行的补充

    解释型语言单个进程下多个线程不可以并行,但是向C语言等其他语言中在多核情况下是可以实现并行的,所有语言在单核下都是无法实现并行的,只能并发。

    3.TCP服务端实现并发

    #服务端
    import socket
    from threading import Thread
    
    
    
    server = socket.socket()
    server.bind(('127.0.0.1',6666))
    server.listen(5)
    def serv(conn,addr):
        while True:
            try:
                print(addr)
                rec_data = conn.recv(1024).decode('utf-8')
                print(rec_data)
                send_data = rec_data.upper()
                conn.send(send_data.encode('utf-8'))
            except Exception as e:
                print(e)
                break
    
    while True:
        conn,addr = server.accept()
        t = Thread(target=serv,args=(conn,addr))
        t.start()
    #客户端
    import socket
    import time
    
    client = socket.socket()
    client.connect(('127.0.0.1',6666))
    while True:
        client.send(b'hello')
        data = client.recv(1024)
        print(data)
        time.sleep(1)

    4.GIL全局解释器锁

    在CPython中,全局解释器锁(即GIL)是一个互斥锁,可以防止一个进程中的多个线程同时(并行)执行。 锁定是必要的,主要是因为CPython的内存管理不是线程安全的。GIL的存在就是为了保证线程安全。

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

    在纯计算程序中GIL锁起到锁定python解释器的作用,就是一个线程抢到解释器后不会再有其他线程抢到解释器的使用权(直到这个程序遇到IO操作,这时GIL会释放解释器的使用权)。(一个线程只有运行结束才会被内存管理机制回收)

    import time
    from threading import Thread,current_thread
    
    
    number = 100
    
    def task():
        global number
        number2 = number
        number = number2 - 1
        print(number,current_thread().name)
    
    for line in range(100):
        t = Thread(target=task)
        t.start()
        
    99 Thread-1
    98 Thread-2
    97 Thread-3
    96 Thread-4
    95 Thread-5
    94 Thread-6
    93 Thread-7
    92 Thread-8
    91 Thread-9
    90 Thread-10
    。
    。
    。

    给这个程序加上IO操作看下打印结果:

    import time
    from threading import Thread,current_thread
    
    
    number = 100
    
    def task():
        global number
        number2 = number
        #print(number)
        time.sleep(1)
        number = number2 - 1
        #time.sleep(1)#如果sleep放在这里,则会打印结果都是0,这是因为线程间数据是共享的
        print(number,current_thread().name)
    
    for line in range(100):
        t = Thread(target=task)
        t.start()
        
    99 Thread-24
    99 Thread-23
    99 Thread-22
    99 Thread-20
    99 Thread-18
    99 Thread-17
    99 Thread-15
    99 Thread-21
    99 Thread-14
    .
    .
    .

    5.验证多线程的作用

    什么时候使用多线程,什么时候使用多进程,多线程和多进程各有什么优缺点?

    结论:在计算密集型程序中使用多进程,这时能够充分发挥计算机多核的优势;在IO密集型的程序中使用多线程,这时能够充分发挥多线程对CPU高校利用率的优势。高效执行多个进程,内有多个IO密集型程序,要使用多进程+多线程。

    对结论的验证:

    运算密集型操作验证:

    from threading import Thread
    from multiprocessing import Process
    import os,time
    
    #计算密集型多进程下运行
    def work1():
        number = 0
        for line in range(50000000):
            number += 1
    
    
    if __name__ == '__main__':
        #测试计算密集型
        print(os.cpu_count())#打印CPU有几个内核
        start_time = time.time()
        list1 = []
        for line in range(4):
            p = Process(target=work1)
            list1.append(p)
            p.start()
            #p.join()#join如果放在这里比在列表里执行速度慢,是因为在列表里是等所有的进程都起来之后再告诉系统要加join,而在第一个for循环里面则是每起一个进程都会告诉系统一次,这个过程需要时间。
    
        for p in list1:
            p.join()
        end_time = time.time()
        print(f'程序执行的时间{end_time - start_time}')
    #12.24461030960083
    
    
    #多线程下运行
    from threading import Thread
    from multiprocessing import Process
    import os,time
    
    #计算密集型
    def work1():
        number = 0
        for line in range(50000000):
            number += 1
    #IO密集型
    def work2():
        time.sleep(1)
    
    if __name__ == '__main__':
        #测试计算密集型
        print(os.cpu_count())#打印CPU有几个内核
        start_time = time.time()
        list1 = []
        for line in range(4):
            p = Thread(target=work1)
            list1.append(p)
            p.start()
            #p.join()#4.407487869262695
    
        for p in list1:
            p.join()
        end_time = time.time()
        print(f'程序执行的时间{end_time - start_time}')
    #16.305360794067383

    这里本人的测试结果是在计算的数据比较大时开启多进程才会有优势,如果运算数据比较小,开启多线程运算速度反而比开启多进程快得多。

    IO密集型操作验证:

    #多进程测试
    
    from threading import Thread
    from multiprocessing import Process
    import os,time
    
    
    #IO密集型
    def work2():
        time.sleep(1)
    
    if __name__ == '__main__':
        #测试IO密集型
        print(os.cpu_count())#打印CPU有几个内核
        start_time = time.time()
        list1 = []
        for line in range(4):
            p = Process(target=work2)
            list1.append(p)
            p.start()
            #p.join()#4.407487869262695
    
        for p in list1:
            p.join()
        end_time = time.time()
        print(f'程序执行的时间{end_time - start_time}')
    #2.642327070236206
    
    
    #多线程测试
    from threading import Thread
    from multiprocessing import Process
    import os,time
    
    
    #IO密集型
    def work2():
        time.sleep(1)
    
    if __name__ == '__main__':
        #测试IO密集型
        print(os.cpu_count())#打印CPU有几个内核
        start_time = time.time()
        list1 = []
        for line in range(4):
            p = Thread(target=work2)
            list1.append(p)
            p.start()
            #p.join()#4.407487869262695
    
        for p in list1:
            p.join()
        end_time = time.time()
        print(f'程序执行的时间{end_time - start_time}')
    #1.0189073085784912

    可以看出在IO密集型操作中,开相同数量的程要比开相同数量的线程执行速度慢

    6.死锁现象

    所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁。

    from threading import Lock,Thread,current_thread
    import time
    
    
    mutex_a = Lock()#实例化一把锁
    mutex_b = Lock()
    
    class MyThread(Thread):
        def run(self):
            self.func1()
            self.func2()
    
        def func1(self):
            mutex_a.acquire()
            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')
            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()
    用户Thread-1抢到了锁a
    用户Thread-1抢到了锁b
    用户Thread-1释放了锁b
    用户Thread-1释放了锁a
    用户Thread-1抢到了锁b
    用户Thread-2抢到了锁a

    当线程1抢到了b而线程2抢到了a时,线程1要执行强a的任务,而线程2要执行抢b的任务,而两把锁都没有释放手中的锁,所以就造成了死锁的现象。

    7.递归锁

    递归锁用于解决死锁问题,递归锁可以被多个线程使用,当第一个线程使用时,遇到几把锁,它的引用计数就为几,只有当它的引用计数为零时才会给第二个线程使用。这样拥有递归锁的那个线程就可以将自己的锁里的内容执行完然后,其他使用递归锁的线程才可以执行。也就是但是第一个使用这把锁的线程会对这把锁加一个引用计数,只有引用计数为零时才能真正释放该锁。

    from threading import Lock,Thread,RLock
    import time
    
    
    mutex_a = mutex_b = RLock()#实例化一把递归锁
    class MyThread(Thread):
        def run(self):
            self.func1()
            self.func2()
    
        def func1(self):
            mutex_a.acquire()
            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')
            time.sleep(0.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()

    8.信号量(了解)

    互斥锁比喻成一个家用马桶,同一时间只能一个人用;信号量比喻成一个公厕,同一时间可以有多个人用。

    from threading import Semaphore,Lock,current_thread,Thread
    import time
    
    sm = Semaphore(5)#5个马桶
    #mutex = Lock()#一个马桶
    def task():
        sm.acquire()
        print(f'{current_thread().name}执行任务')
        time.sleep(1)
        sm.release()
    
    for line in range(20):
        t = Thread(target=task)
        t.start()
    #这段代码的功能是每次让五个线程并发执行

    9.线程队列

    线程Q:线程队列 FIFO(先进先出)就是队列,面试会问。

    queue 是python解释器自带的模块,进程中的Queue是python解释器自带的模块multiprocessing里面的一个类。

    普通队列(FIFO):先进先出
    特殊队列(LIFO):后进先出

    import queue
    q = queue.Queue()#先进先出
    q.put(1)
    q.put(2)
    print('q',q.get())
    
    q1 = queue.LifoQueue()#先进后出
    q1.put(1)
    q1.put(2)
    print('q1',q1.get())
    
    q 1
    q1 2

    优先级队列
    优先级根据数字来判断,数字为几优先级就为几,1的优先级最高
    若参数中传的是元组,优先级以第一个元素的数字大小为准,如果元组的第一个元素都为字母则以字母的ASCII码为准,如果第一个元素的优先级相同就判断第二个元素的顺序(汉字也会判断顺序)但是如果同一列的元素既有数字又有字母会报错。

    import queue
    q2 = queue.PriorityQueue()#优先级队列
    
    q2.put((1,2,3))
    q2.put((2,2,3))
    q2.put((3,2,3))
    print(q2.get())
    
    (1, 2, 3)
    相关文章
    相关标签/搜索
    彩霸王超级中特网118图库天下彩天空彩免费大全香港蓝月亮精选资料六合宝典天天彩票新版 古蔺县| 乌兰察布市| 石棉县| 香格里拉县| 增城市| 乡城县| 喀什市| 沛县| 巴青县| 沁阳市| 高青县| 石楼县| 平塘县| 涟水县| 固原市| 中牟县| 浑源县| 丹棱县| 台东县| 江安县| 霍城县| 尖扎县| 巴青县| 称多县| 平罗县| 平湖市| 禹州市| 朝阳区| 罗甸县| 牙克石市| 肇州县| 射阳县| 依兰县| 东乌| 渭源县| 新民市| 井冈山市| 理塘县| 永定县| 玉树县| 和林格尔县| 商丘市| 天峻县| 邹平县| 开江县| 临澧县| 德格县| 京山县| 芜湖县| 连云港市| 绥德县| 九龙城区| 监利县| 库车县| 浙江省| 新津县| 清新县| 白朗县| 蒲城县| 府谷县| 仁化县| 定远县| 临洮县| 阳谷县| 曲沃县| 中卫市| 富顺县| 林西县| 内乡县| 山西省| 巫山县| 永寿县| 青神县| 衡东县| 七台河市| 田东县| 奉节县| 磐安县| 安平县| 瓮安县| 霞浦县| 米易县| 库尔勒市| 阆中市| 灵台县| 通辽市| 绍兴市| 梅河口市| 泸州市| 龙海市| 砀山县| 永川市| 桓台县| 丹棱县| 平潭县| 台南县| 湖南省| 海兴县| 大洼县| 建湖县| 蚌埠市| 公主岭市| 株洲县| 阿城市| 罗江县| 绵竹市| 原平市| 大化| 长乐市| 天峨县| 正安县| 观塘区| 乌兰浩特市| 乌拉特前旗| 黑龙江省| 泸定县| 金阳县| 江西省| 会泽县| 安达市| 阿勒泰市| 武乡县| 且末县| 江北区| 同德县| 砀山县| 大埔县| 廉江市| 仙居县| 涞源县| 大兴区| 马尔康县| 曲阳县| 台前县| 安泽县| 宜丰县| 青阳县| 昌江| 衡水市| 广河县| 禄劝| 青岛市| 涞水县| 和田县| 蓬莱市| 浮山县| 临清市| 大名县| 罗甸县| 黔东| 汤阴县| 岳阳县| 津市市| 正安县| 大竹县| 新余市| 宁海县| 江川县| 大兴区| 和龙市| 阳曲县| 修水县| 阿尔山市| 延安市| 太保市| 宿迁市| 上杭县| 诸暨市| 连南| 卢龙县| 高清| 青海省| 兴国县| 威信县| 英超| 玉溪市| 邯郸市| 沁源县| 太仆寺旗| 连南| 金昌市| 历史| 萝北县| 寿阳县| 昂仁县| 宝应县| 沙雅县| 都昌县| 达孜县| 调兵山市| 静海县| 永清县| 民县| 福泉市| 临夏市| 惠东县| 阿拉善右旗| 望江县| 娱乐| 桃园县| 浦北县| 阜南县| 清涧县| 义乌市| 柘城县| 恩平市| 平远县| 巴南区| 循化| 济宁市| 丽江市| 雷山县| 铜鼓县| 永济市| 甘泉县| 九江县| 玛多县| 沾化县| 昌宁县| 林西县| 静乐县| 三河市| 泗水县| 漳平市| 镇江市| 平阳县| 大田县| 五大连池市| 聊城市| 陵川县| 聂拉木县| 桃园县| 涟源市| 丹东市| 茂名市| 积石山| 两当县| 宣化县| 宣城市| 兴宁市| 仁布县| 湟中县| 云梦县| 沙湾县| 灵山县| 滨州市| 靖远县| 鞍山市| 兴宁市| 边坝县| 天全县| 岳阳市| 鹤岗市| 石柱| 太和县| 白水县| 盐亭县| 温州市| 外汇| 和田市| 克山县| 项城市| 互助| 那坡县| 类乌齐县| 井研县| 隆林| 泌阳县| 宜城市| 富裕县| 城固县| 彰武县| 庆阳市| 霞浦县| 宁晋县| 孟津县| 军事| 绥江县| 崇礼县| 阜阳市| 武鸣县| 和田市| 扎鲁特旗| 民勤县| 潞西市| 临洮县| 灵璧县| 元氏县| 永德县| 江西省| 边坝县| 东宁县| 西林县| 白沙| 伊宁县| 黑河市| 珲春市| 南丰县| 扶余县| 扎兰屯市| 盐源县| 淄博市| 翁牛特旗| 贺兰县| 宁德市| 石嘴山市| 建平县| 和静县| 洛阳市| 定陶县| 徐闻县| 茂名市| 淄博市| 务川| 稷山县| 新宾| 当阳市| 张家港市| 宜城市| 怀宁县| 怀集县| 丘北县| 洪洞县| 建湖县| 郓城县| 德安县| 娱乐| 永定县| 大宁县| 论坛| 瑞安市| 晋州市| 马关县| 钟山县| 本溪| 永宁县| 南昌市| 苗栗县| 建平县| 旌德县| 宝山区| 新郑市| 普定县| 文昌市| 宜兴市| 八宿县| 花垣县| 唐山市| 云梦县| 金秀| 巴林右旗| 安达市| 南阳市| 徐闻县| 墨江| 陇西县| 安龙县| 和静县| 华坪县| 衡山县| 康保县| 曲水县| 扎鲁特旗| 怀化市| 竹北市| 独山县| 东丰县| 郴州市| 四川省| 正宁县| 嘉峪关市| 镇原县| 乌兰县| 龙里县| 武夷山市| 克什克腾旗| 大同县| 广东省| 南皮县| 三门峡市| 施甸县| 汽车| 和田市| 芜湖市| 灵山县| 林州市| 如皋市| 诸城市| 永和县| 本溪| 嘉定区| 阿克陶县| 灵璧县| 油尖旺区| 呼玛县| 永川市| 合川市| 美姑县| 永宁县| 桃园市| 黑河市| 梨树县| 云和县| 绥芬河市| 马公市| 旅游| 仙居县| 泊头市| 桂林市| 安徽省| 甘谷县| 太和县| 普宁市| 高平市| 乐平市| 西林县| 韩城市| 安康市| 北辰区| 林西县| 吉木萨尔县| 通化县| 杭锦后旗| 淮滨县| 霍州市| 庄浪县| 孙吴县| 弥渡县| 浦城县| 南江县| 米脂县| 葵青区| 怀柔区| 南宫市| 筠连县| 金湖县| 五峰| 全州县| 乐清市| 惠安县| 乐亭县| 津市市| 安康市| 文水县| 闸北区| 临武县| 成都市| 潼南县| 金堂县| 黎平县| 信阳市| 满洲里市| 鄯善县| 延安市| 兰考县| 周宁县| 金川县| 玛多县| 齐齐哈尔市| 承德市| 安仁县| 邵阳县| 霍城县| 岫岩| 岳阳县| 吉安市| 崇明县| 冀州市| 昭平县| 东丰县| 贡觉县| 合肥市| 洛隆县| 临海市| 马鞍山市| 南康市| 民勤县| 成安县| 屏南县| 固镇县| 高密市| 方城县| 明溪县| 时尚| 神池县| 南阳市| 彰化县| 九江县| 瑞丽市| 苏尼特右旗| 吴忠市| 尚志市| 胶州市| 旌德县| 望都县| 朝阳县| 古浪县| 屏东县| 三穗县| 白玉县| 兴隆县| 桂东县| 巴马| 文成县| 乌什县| 故城县| 牙克石市| 淮南市| 肥东县| 上饶县| 盐亭县| 梧州市| 普格县| 筠连县| 定陶县| 大庆市| 玛曲县| 永兴县| 同江市| 老河口市| 奈曼旗| 河南省| 丹棱县| 甘洛县| 古浪县| 云林县| 井研县| 屯昌县| 绵竹市| 成都市| 四会市| 茌平县| 宁武县| 常宁市| 承德市| 开阳县| 遂溪县| 邯郸县| 西丰县| 东明县| 乡城县| 甘谷县| 天气| 公安县| 德清县| 旌德县| 凌源市| 芷江| 尚志市| 商洛市| 滕州市| 正安县| 温宿县| 霍林郭勒市| 莱西市| 白朗县| 阜新| 横山县| 乐业县| 海宁市| 肃北| 咸阳市| 仁化县| 漠河县| 宕昌县| 南阳市| 阿合奇县| 镇平县| 宁南县| 杨浦区| 滨州市| 阿坝县| 微博| 冀州市| 喀什市| 龙陵县| 汝城县| 浦东新区| 武强县| 竹山县| 买车| 延寿县| 毕节市| 荃湾区| 罗山县| 宝兴县| 乌鲁木齐县| 连江县| 沁阳市| 瑞安市| 明溪县| 福州市| 盱眙县| 栾城县| 西畴县| 台州市| 峨眉山市| 安吉县| 蒲城县| 武义县| 忻州市| 淮滨县| 开封县| 阿坝县| 红桥区| 北京市| 涿州市| 门头沟区| 泰兴市| 阿拉善盟| 仙居县| 固阳县| 泾阳县| 孝义市| 玉山县| http://3g.jx1870coverv.fun http://m.jx1870cazpv.fun http://jx1870auditv.fun http://3g.jx1870cottonv.fun http://www.jx1870doublev.fun http://www.jx1870controlv.fun http://www.jx1870doubtv.fun http://m.jx1870chancev.fun http://jx1870avoidv.fun http://jx1870basev.fun http://wap.jx1870enablev.fun http://www.jx1870delayv.fun http://wap.jx1870centrev.fun http://3g.jx1870accountv.fun http://jx1870bobv.fun http://www.jx1870dogv.fun http://wap.jx1870battlev.fun http://wap.jx1870couplev.fun