zoukankan      html  css  js  c++  java
  • 线程锁

    from threading import Thread,Lock
    
    x=0
    lock=Lock()
    def test():
        lock.acquire()      #锁住不让cpu切换
        global x
        for i in range(111100):
            x+=1
        lock.release()
    t=Thread(target=test)
    t1=Thread(target=test)
    t2=Thread(target=test)
    t.start()
    t1.start()
    t2.start()
    t.join()
    t1.join()
    t2.join()
    print(x)
    

    死锁问题及递归锁

    死锁

    被其他线程占用了锁头导致线程阻塞

    from threading import Thread,Lock
    import time
    l1=Lock()
    l2=Lock()
    def test1():
        l1.acquire()
        print('one1suo')
        time.sleep(1)
        l2.acquire()
        print('one2suo')
        l1.release()
        print('one1fang')
        l2.release()
        print('one2fang')
    def test2():
        l2.acquire()
        print('two2suo')
        l1.acquire()
        print('two1suo')
        l2.release()
        print('two2fang')
        l1.release()
        print('two1fang')
    
    t=Thread(target=test1)
    t1=Thread(target=test2)
    t.start()
    t1.start()
    

    递归锁

    同一个锁可多次使用acquier()和release()

    from threading import Thread,RLock,Lock
    import time
    l1=RLock()
    l2=l1
    def test1():
        l1.acquire()
        print('one1suo')
        time.sleep(1)
        l2.acquire()
        print('one2suo')
        l1.release()
        print('one1fang')
        l2.release()
        print('one2fang')
    def test2():
        l2.acquire()
        print('two2suo')
        l1.acquire()
        print('two1suo')
        l2.release()
        print('two2fang')
        l1.release()
        print('two1fang')
    
    t=Thread(target=test1)
    t1=Thread(target=test2)
    t.start()
    t1.start()
    

    信号量

    from threading import Thread,RLock,Lock,Semaphore
    import time
    
    def test1():
        s.acquire()
        print('nice')
        time.sleep(1)
        s.release()
    s=Semaphore(5)
    for i in range(15):
        t = Thread(target=test1)
        t.start()
    

    GIL全局解释器锁

    # 在Cpython解释器中有一把GIL锁(全局解释器锁),GIl锁本质是一把互斥锁。
    # 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
    # 同一个进程下多个线程只能实现并发不能实现并行.
    
    # 为什么要有GIL?
    # 因为cpython自带的垃圾回收机制不是线程安全的,所以要有GIL锁.
    
    # 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
    #
    #分析:
    # 我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
    # 方案一:开启四个进程
    # 方案二:一个进程下,开启四个线程
    
    # 计算密集型 推荐使用多进程
    #  每个都要计算10s
    #  多线程
    #  在同一时刻只有一个线程会被执行,也就意味着每个10s都不能省,分开每个都要计算10s,共40.ns
    #  多进程
    #  可以并行的执行多个线程,10s+开启进程的时间
    
    # io密集型 推荐多线程
    # 4个任务每个任务90%大部分时间都在io.
    # 每个任务io10s 0.5s
    # 多线程
    # 可以实现并发,每个线程io的时间不咋占用cpu, 10s + 4个任务的计算时间
    # # 多进程
    # 可以实现并行,10s+1个任务执行的时间+开进程的时间
    
  • 相关阅读:
    如何为创建大量实例节省内存?
    4-5
    4-6
    4-4
    4-3
    4-2
    3-11
    4-1
    3-10
    3-8
  • 原文地址:https://www.cnblogs.com/TMesh/p/11568088.html
Copyright © 2011-2022 走看看