1.匿名函数
lambda 是python 定义匿名函数的语法
lambda表达式就是一个函数,可以赋值给一个变量,既然是表达式,可以参与运算。
(1)lambda轻便
(2)给map等函数式编程使用
**map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
print map(lambda x:x**2, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>[1, 4, 9, 10, 25, 36, 49, 64, 81]
2.可迭代对象:可以使用for ..in...语句进行循环的对象就是可迭代对象,如列表,元组,字典
迭代器:可以使用next()方法来回调的并不断返回下一个值的对象。>>>最后一个会报错
iter(可迭代对象)>>>>迭代器
生成器:本质上是一个迭代器,也可以在迭代中操作,与迭代器的区别是,生成器更加简洁。
调用next(函数)的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
3.死锁:当线程之间共享多个资源,并且两个线程同时拥有一部分资源的同时,都在等待对方的资源,造成死锁
解决办法:银行家算法,添加超时任务
4.# 要想了解GIL,首先要知道什么是并行和并发?
1.并发:进行交替处理多件事情。
2.并行:多个cpu同时处理多个事,只在多核上能实现。
# 然后,我们要知道为什么会产生GIL?
解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,当时Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu , cpython解析只允许拥有GIL全局解析器锁才能运行程序,保证同一个时刻只允许一个线程可以使用cpu,大量的程序开发者接收了这套机制,现在代码量越来越多,已经不容易通过c代码去解决这个问题。
# 什么是GIL?
GIL是全局解析器锁,保证同一时刻只有一个线程可以使用cpu,让我们的多线程没办法真正实现并行。(解释 : 当我们使用多线程的时候,在一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL谁就可以使用cpu(ps:多个进程有多个GIL锁))
# 什么时候会释放GIL锁?
1 、遇到像 i/o操作这种会有时间空闲造成cpu闲置的情况会释放GIL。
2 、会有一个专门ticks进行计数,一旦ticks数值达到100,这个时候释放GIL锁,线程之间开始竞争GIL锁(说明:ticks这个数值可以进行设置来延长或者缩减获得GIL锁的线程使用cpu的时间)。
# 怎么解决GIL?
1、更换cpython为jpython(不建议),比较慢
2、使用多进程完成多线程的任务
3、在使用多线程可以使用c语言去实现
# 互斥锁和GIL锁的关系
GIL锁 : 保证同一时刻只有一个线程能使用到cpu。
互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱。
首先假设只有一个进程,这个进程中有两个线程 Thread1、Thread2,要修改共享的数据date,并且有互斥锁。执行以下步骤:
(1)多线程运行,假设Thread1获得GIL可以使用cpu,这时Thread1获得 互斥锁lock,Thread1可以改date数据(但并没有开始修改数据)
(2)Thread1线程在修改date数据前发生了 i/o操作 或者 ticks计数满100 (注意就是没有运行到修改data数据),这个时候 Thread1 让出了GIL,GIL锁可以被竞争
(3) Thread1 和 Thread2 开始竞争 GIL(注意:如果Thread1是因为 i/o 阻塞 让出的GIL Thread2必定拿到GiIL,如果Thread1是因为ticks计数满100让出GIL 这个时候 Thread1 和 Thread2 公平竞争)
(4)假设 Thread2正好获得了GIL,运行代码去修改共享数据date,由于Thread1有互斥锁lock,所以Thread2无法更改共享数据date,这时Thread2让出GIL锁 , GIL锁再次发生竞争
(5)假设Thread1又抢到GIL,由于其有互斥锁Lock所以其可以继续修改共享数据data,当Thread1修改完数据释放互斥锁lock,Thread2在获得GIL与lock后才可对data进行修改
5.django 中的虚拟环境---virtualenv..........读法 virtual +env
每个应用可能需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。
# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 进入虚拟环境、查看所有虚拟环境
deactivate # 退出虚拟环境
# pip
pip install # 安装依赖包
pip uninstall # 卸载依赖包
pip list # 查看已安装的依赖包
pip freeze # 冻结当前环境的依赖包