码迷,mamicode.com
首页 > 其他好文 > 详细

py知识(每日更新) 7.25

时间:2019-08-09 19:02:07      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:dom   sleep   开启   有一个   多进程   class   res   并发   random   

  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

标签:dom   sleep   开启   有一个   多进程   class   res   并发   random   

原文地址:https://www.cnblogs.com/lyoko1996/p/11328872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!