py知识(每日更新) 7.25

Posted lyoko1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了py知识(每日更新) 7.25相关的知识,希望对你有一定的参考价值。

  1. GIL锁.

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

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

    进程池: 放置进程的一个容器.
    线程池: 放置线程的一个容器.
    
    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)  # 给线程池放任务,传参
    

以上是关于py知识(每日更新) 7.25的主要内容,如果未能解决你的问题,请参考以下文章

py知识(每日更新) 8.2

py知识(每日更新) 7.1

py知识(每日更新) 7.12

py知识(每日更新) 7.2

py知识(每日更新) 8.5

py知识(每日更新) 6.13