文档章节

Python线程和进程的了解,多线程多进程

Its_Ryan
 Its_Ryan
发布于 2017/05/25 21:30
字数 1793
阅读 15
收藏 0

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

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
<deque:list存储数据时按索引访问元素很快但是插入和删除元素很慢,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。

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是流模式,边读边解析占用内存小解析更快,缺点是需要自己处理事件

© 著作权归作者所有

Its_Ryan
粉丝 0
博文 23
码字总数 22267
作品 0
其他
私信 提问
(转载)Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎 https://zhuanlan.zhihu.com/p/24283040 Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线...

avatus
2018/09/05
0
0
python多线程和多进程——python并行编程实验

工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程。至于python的并发编程这一块,笔者看到一些python圈的圈友们经常诟病python的全局解释...

王鹏你妹
05/29
0
0
一篇文章搞定Python多进程(全)

公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现和GIL - https://mp.weixin.qq.com/s/Hgp-x-...

南山yrg
05/05
0
0
Python---多进程与多线程笔记

1.多进程与多线程介绍 / 区别 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案就是操...

wayne_dream
2018/07/08
0
0
python高性能编程--002--全局解释器锁GIL

一、GIL基本概念 1.GIL即为gloabl interpreter lock,全局解释器锁。这个东西是在python解释器之一的cpython中引入的一个概念,因为我们现在常用的python解释器就是cpython这个解释器,故而G...

Ryan_snow
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器中的JVM资源该如何被安全的限制?

前言 Java与Docker的结合,虽然更好的解决了application的封装问题。但也存在着不兼容,比如Java并不能自动的发现Docker设置的内存限制,CPU限制。 这将导致JVM不能稳定服务业务!容器会杀死你...

xiaomin0322
10分钟前
1
0
mysql查询最近连续登录和累计登录

这条sql写了一天,百度无数,终于摸到点门路 需求是查询从当前日期向前推的连续登录,比如一个用户他今天登录了,昨天没登,连续登录为1 他昨天前天都登录了,今天没登录,连续登录为0 SELEC...

七月大人
12分钟前
0
0
常用的一些Vip解析

无广告解析推荐(排行不分前后) 黑米免费解析   https://www.myxin.top/jx/api/?url= 随缘免费解析   http://www.syhbyl.tw/jx/api/?url= 快快免费解析   http://jx.kkqtv.com/jx/...

chenhongjiang
12分钟前
1
0
Netty 整合spring bean注入失败。

1.Netty整合spring bean注入为null的问题,自己折腾了好久,试过各种方式(@Component,@PostConstruct)这些都不行。 2.最后发现了关键的问题就是添加的回调类(处理类)/初始化的类也必须由s...

轻量级赤影
17分钟前
6
0
消息中间件

本文大概围绕如下几点进行阐述: 为什么使用消息队列? 使用消息队列有什么缺点? 消息队列如何选型? 如何保证消息队列是高可用的? 如何保证消息不被重复消费? 如何保证消费的可靠性传输? 如何...

石日天
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部