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)  # 给线程池放任务,传参
    

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

时间: 2024-11-09 10:03:00

py知识(每日更新) 7.25的相关文章

py知识(每日更新) 6.18

万能传参 #当给函数传入的参数数目不定时,之前的穿饭餐方式解决不了问题 #万能参数//动态参数*args 将实参角度: 定义一个函数时* 所有位置参数聚合到一个元祖中. # **kwargs 函数定义是:**讲实参角度所有的关键字参数聚合成一个字典 * 的魔性用法: def func(*args,**kwargs): print(args) print(kwatgs) l1 = [1,2,3] l2 = ["阿萨德","去去去"] 函数形参角度的形参顺序 位置参数&

py知识(每日更新) 7.1

包的使用 第一类: ? 执行文件 通过import导入包以及包内的功能 ? 创建一个aaa的包,自行创建一个__init__py文件 ? 创建一个包会发生三件事儿: ? 1.将以XXX包内的__init__py文件加载到内存中 ? 2.创建一个以XXX命名的名称空间. ? 3.通过XXX . 的当时引用__init__的所有的名字. import aaa # 如何在当前文件中,引用aaa包的bbb包? 1.在执行文件写入 import aaa 2. aaa的__init__ 里面写 from a

py知识(每日更新) 8.2

连表查询 # 笛卡尔积 # 先计算两张表的笛卡尔积,再根据用户给出的条件进行筛选 select * from employee,department where dep_id = department.id # 内连接 inner join ... on 连接条件 select * from 表1 inner join 表2 on 条件 select * from employee inner join department on dep_id = department.id employee

py知识(每日更新) 7.30

sql语句的分类 sql语句的分类 # DDL : CREATE ALTER DROP # DML : SELECT INSERT DELETE UPDATE # DCL : GRANT REVOKE 常用sql语句 # 库 # create database 库名; # use 库名 # show tables; # 表 # create table 表名(字段名 类型(长度),...); # desc 表名; # show create table 表名; # alter table 表名

py知识(每日更新) 6.5

1整数 int 计算和比较 a.bit_length() #求十进制数转换为二进制时所占用的位数 2布尔值 bool True 真 False 假 数字转成布尔值: 0 False 非0 True 字符串转换成布尔值: 空字符串 "" False 非空 True 布尔值转换成数字 True = 1 False = 0 布尔值转换成字符串 True = str(True) False = str(False) 3字符串 作用:存储少量数据 索引(下标):从左向右 0, 1, 2, 3;;

py知识(每日更新) 6.13

文件操作初识 f = open("文件",mode="模式",encoding="编码") open() #调用操作系统打开文件 mode #对文件的操作方式 encoding #文件的编码 ? #不写indocing 默认为系统编码 Windows--gbk ? #linux&mac ----utf-8 f 文件句柄 ---- 操作文件的锅把 文件操作怎么用? 读 r rb r+ r+b r 读 r+ 读写 #后期开发中使用频率比较低

py知识(每日更新) 7.2

collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和OrderedDict等. 1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.Counter: 计数器,主要用来计数 4.OrderedDict: 有序字典 5.defaultdict:

py知识(每日更新) 7.16

socket套接字 五层协议:从传输层包括传输层以下,都是操作系统版主我们封装的各种head 套接字:他存在于传输层与应用层之间的抽象层 ? 1.避免你学习各层的接口以及协议的使用 socket已经封装好了所有的接口.直接使用这这些接口或者方法即可,提升开发效率. ? 2.在Python中socket就是一个模块.通过调用模块中已经实现的方法建立两个进程之间的通信. 单个客户端通讯 # client端 import socket # 1. 创建socket对象 phone = socket.so

py知识(每日更新) 7.12

反射 通过字符串去操作一个对象 字符串: 字符串类型 对象: 实例,类,当前文件(模块),其他模块 hasattr() # getattr() # setattr() # 增 delattr() # 删 函数VS方法 1.通过函数名可以大致判断 print(func) print(obj.func) 2.通过模块types模块去验证 from types import FunctionType from types import MethodType print(isinstance(func,