py knowledge (updated daily) 7.25

  1. GIL lock.

    GIL锁: 全局解释器锁. 就是一个把互斥锁,将并发变成串行,同一时刻只能有一个线程使用共享资源,牺牲效率,保证数据安全.
    
    带来的问题1:
    ​ 单进程的多线程不能利用多核. 诟病之一.
    ​ 多进程的多线程可以利用多核.
    带来的问题2:
    ​ 感觉上不能并发的执行问题.
    讨论: 单核处理IO阻塞的多线程,与多核处理IO阻塞的多线程效率差不多.
    
    # 多核的前提下: 如果任务Io密集型: 多线程并发.如果任务计算密集型: 多进程并发.
  2. GIL relationship with the mutex lock.

    # 1. GIL 自动上锁解锁, 文件中的互斥锁Lock 手动上锁解锁.
    # 2. GIL锁 保护解释器的数据安全. 文件的互斥锁Lock 保护的文件数据的安全.
     # 线程全部是计算密集型:当程序执行,开启100个线程时,第一个线程先要拿到GIL锁,然后拿到lock锁,释放lock锁,最后释放GIL锁.
    
  3. Process pool thread pool.

    进程池: 放置进程的一个容器.
    线程池: 放置线程的一个容器.
    
    from concurrent.futures import ProcessPoolExecutor
    from concurrent.futures import ThreadPoolExecutor
    import time
    import os
    import random
    
    def task(name):
        print(name)
        print(f'{os.getpid()} 准备接客')
        time.sleep(random.randint(1,3))
    
    
    if __name__ == '__main__':
        p = ProcessPoolExecutor()  # 设置进程数量默认为cpu个数
        for i in range(23):
            p.submit(task,1)  # 给进程池放任务,传参
    
    
    def task(name):
        print(name)
        print(f'{os.getpid()} 准备接客')
        time.sleep(random.randint(1,3))
    
    
    if __name__ == '__main__':
        p = ThreadPoolExecutor()  # ,默认cpu数量*5
        for i in range(23):
            p.submit(task,1)  # 给线程池放任务,传参
    

Guess you like

Origin www.cnblogs.com/lyoko1996/p/11328872.html