python的线程和进程_Python线程和进程的了解,多线程多进程

锁:好处是确保某段关键代码只能由一个线程从头到尾的完整执行

坏处是有:阻止了多线程并发执行,包含锁的某段代码实际上只是以单线程模式运行,效率大大下降,其次,由于存在多个锁,不同的线程持有不同的锁并试图获取对方的锁时,可能会造成死锁,导致多个线程全部挂起

macOS--activity monitor

Windows--task manager

Python的线程虽然也是真正的线程但是解释器执行代码的时候有一个GIL锁:global interpreter lock,任何Python线程执行之前必须获得GIL锁,然后每执行100条字节码解释器就自动释放GIL锁,让别的线程有机会执行,这个GIL全局锁实际上把所有线程的

执行代码都上了锁,所以多线程在Python中只能交替执行

GIL是Python解释器设计的历史遗留问题,通常使用的解释器是官方实现的CPython,要真正利用多核除非重写一个不带GIL的解释器

所以在Python中可以使用多线程但是不要指望能有效利用多核,Python虽然不能利用多线程实现多核任务但是可以通过多进程实现多核任务,多个Python进程有各自独立的GIL锁,互不影响。

threadlocal最常用的地方是为每个线程绑定一个数据库连接,http请求,用户身份信息,这样一个线程所有调用的处理函数都可以很方便的访问这些资源

线程切换:先保存当前执行的现场环境(CPU寄存器状态,内存页),准备新任务执行环境。

计算密集型和IO密集型:计算密集型任务同时进行的数量应当等于CPU的核心数,计算密集型主要消耗CPU资源所以代码运行效率至关重要

io密集型涉及到网络磁盘io的任务都是io密集型,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待io操作完成

异步io:考虑到CPU和io之间的巨大速度差异,一个任务的执行过程中大部分时间都在等待io操作,单线程单进程模型会导致别的任务无法执行,因此需要多进程多线程来支持多任务的并发执行

充分利用操作系统提供的异步io支持就可以用单线程单进程模型来执行多任务,这种全新的模型称为事件驱动模型

Nginx就是支持异步io的web服务器,它在单核CPU上采用单进程模型就可以高效的支持多任务,在多核CPU上可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。由于总的进程数量十分有限,因此操作系统调度非常高效,用异步io编程模型来实现多任务是一个主要趋势

对应到Python语言,单进程的异步编程模型称为协程,有协程的支持可以基于事件驱动编写高效的多任务程序

分布式进程:线程和进程中,优先选择进程,其中manager子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者将任务分布到其他多个进程中,依靠网络通讯。

Python的分布式进程接口简单封装良好适合把繁重任务分布到多台机器环境下

正则表达式:匹配

内建模块:collections集合类,namedtuple函数创建自定义tuple对象且规定了tuple元素的个数,可以用属性而不是索引来引用tuple的某个元素

举例:Circle = namedtuple('Circle',['x','y','r'])

collections

defaultdict:使用dict如果引用的key不存在会抛出keyerror错误,如果希望key不存在时返回一个默认值就可以使用defaultdict

ordereddict:使用dict时key是无序的,在对key做迭代时我们无法确定key的顺序,如果要保持key的顺序,可以使用ordereddict,但是需要注意的是ordereddict会按照key插入的顺序排列而不是key本身排序,也可以实现一个先入先出的dict,容量超出限制的时候先删除最早添加的key

counter:简单计数器,例如统计字符出现的次数>

base64:用64个字符表示任意二进制数据的方法  二进制到字符串的转换方法,base64是一种常见的二进制编码方法

struct:Python没有专门处理字符依赖

摘要算法:MD5,SHA1等,摘要算法又称为哈希算法,散列算法,把任意长度的数据转换为长度固定的数据串(通常是十六进制的字符串),可见摘要算法就是通过摘要函数对任意长的数据计算出固定长度摘要,摘要函数是一个单向函数

比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,并且摘要长度更长,任何摘要算法都是把无限多数据集合映射到有限的集合中

过于简单的口令的摘要算法值很容易被计算出来,通过对原始密码“加盐”的形式生成复杂字符串

摘要算法不是加密算法,不能用于加密,因为无法通过摘要反推明文,只能用于防篡改但是他的单向计算的特性决定了可以在不存储明文口令的情况下验证用户口令

itertools:操作迭代对象,count()创建无限迭代器,cycle()创建无限重复迭代,repeat(重复源,重复次数)限定迭代次数迭代器,takewhile()条件判断截取有限序列,chain(多参,迭代元)串联迭代对象形成更大的迭代器,groupby()重复元素for key,group in itertools.groupby("aaaaabbbbbcccaaa"): print key,list(group)

imap()andifilter()惰性实现map()和filter(),itertools模块提供的都是处理迭代功能的函数,他们返回值不是list而是迭代对象,用for循环迭代才真正的计算

XML。操作XML的两种方法:DOM和sax,DOM会把整个XML读入内存解析为树,占用内存大解析慢,优点在于可以任意遍历树的节点。sax是流模式,边读边解析占用内存小解析更快,缺点是需要自己处理事件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值