python中多线程和多进程的最大区别是稳定性和效率问题

多进程互相之间不影响,一个崩溃了不影响其他进程,稳定性高
多线程因为都在同一进程里,一个线程崩溃了整个进程都完蛋

多进程对系统资源开销大,多线程对系统资源开销小,所以这方面来说多线程会比多进程快一点点

关于线程和进程的详细使用方法这里有https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319272686365ec7ceaeca33428c914edf8f70cca383000

等看完协程再补上

i/o密集型任务瓶颈都在网络,磁盘这些地方,适合用脚本语言进行多任务操作

3.协程

子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

程最大的优势是高执行效率,因为子程序切换不是线程切换,而是由程序自己控制,没有切换线程的开销
不需要多线程锁

协程是建立在生成器基础上的,所以需要先理解迭代器生成器!!!
在一个线程里面不等待IO操作返回的结果,通过消息轮询来发送一个IO操作的请求后就执行其他的,等IO操作返回结果消息了再处理.这个不死等的方式不需要多线程多进程,在一个线程里实现,大大的提高了运行效率

对序列,字典,文件都可以使用iter()方法生成可迭代对象,然后用next()方法访问,这种东西咱们叫迭代器,一般用for循环读出内容

生成器是可迭代的

简单的生成器

my_generator = (x*x for x in range(4))

dir(my_generator ) 里面有iter()和next()属性,说明生成器是迭代器,可以用for循环读取内部的值

>>> for i in my_generator:
...     print i
...
0
1
4
9
>>> for i in my_generator:
...     print i
... 

当第一遍循环的时候,将 my_generator 里面的值依次读出并打印,但是,当再读一次的时候,就发现没有任何结果。这种特性也正是迭代器所具有的,因为已经迭代到最后,指针指向没有内容了

生成器my_generator = (x*x for x in range(4))和列表解析式my_list = [x*x for x in range(4)]有啥不一样的地方呢,列表是先划分出内存来放列表中的数据的,生成器是用到的时候再申请内存,针对大量值的时候,列表占内存较多,迭代器(生成器是迭代器)的优势就在于少占内存,还有一点区别就是上面那个for循环读取内部的值,列表是可以反复取值的,不像生成器指针到最后没有了就不走了,列表的内存划分好了,每次想取值都可以

>>> for i in my_list:
...     print i
...
0
1
4
9
>>> for i in my_list:
...     print i
...
0
1
4
9

yield

python中有个词yield ,这家伙尼玛是生成器的标志
比如

def g():yield 0yield 1yield 2lalalal = g()
print type(lalalal)
print dir(lalalal)
#输出
<type 'generator'>
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']

iter和next,说明是迭代器,用lalalal.next()可以取值的
从上面的例子可以明白,含有yield关键字的函数返回值是一个生成器类型的对象,也是迭代器

我们任性的吧含有yield语句的函数叫做生成器,生成器是一种用普通函数语法定义的迭代器,反正记住,普通函数只要用了yield就变态成为生成器了,当然生成器具备迭代器属性

我们来看看在函数里 yield和return的具体区别

def r_return(n):print "You taked me."while n > 0:print "before return"return nn -= 1print "after return"
rr = r_return(3)
print rr#输出
You taked me.
before return
3
#可以看出来,普通函数遇到return将值返回玩后,函数就不往下继续执行了#再看用yield将函数变为generator生成器之后的样子
def r_return(n):print "You taked me."while n > 0:print "before return"yield nn -= 1print "after return"rr = r_return(3)
print rr.next()
print rr.next()
print rr.next()#输出
You taked me.
before return
3
after return
before return
2
after return
before return
1
#可以看出,用了yield比return好啊,返回完值(迭代一次),还可以再接着执行后面的内容(迭代第二次,第三次),直到跳出循环(没有可迭代的东西了)

一般的函数,都是止于 return。作为生成器的函数,由于有了 yield,则会遇到它挂起,如果还有 return,遇到它就直接抛出 SoptIteration 异常而中止迭代。

send

上面的生成器都是固定的,肚子里有啥就输出什么,自从python2.5之后,生成器有了一个新的特性,就是send方法,用它能直接往生成器的肚子里面传递数据了,让生成器不再是固定输出了

使用send可以接受一个外部传入的变量,然后根据变量内容计算结果之后返回,咱们之后要说的协程就是靠生成器函数的这个特性

def repeater():n=Nonewhile 1:n = (yield n)r= repeater()
r.send(None)
print r.send("new friend come in")
print r.send("tseeee")#输出
new friend come in
tseeee

说下流程
这里和传统函数调用不一样,敲黑板,要通过r.send(None)(ps:如果用了send起手必须传None)或者r.next()或者next(r)来启动生成器函数,并进行到第一个yield语句结束的位置.此时,执行完了yield这一行语句,这个时候括号里的yield n返回初始值0,返回值n=0

然后send(“new friend come in”)这里会传入new friend come in,从下一行开始继续执行,并回到while头部,执行yield n这一行返回n=new friend come in了之后又停下来了,

.再执行r.send(“tseeee”),重复上一步,执行到yield n这一行返回n=tseeee之后再一次停下来

Python 多线程 多进程 协程 yield相关推荐

  1. python 多线程和协程结合_一文讲透 “进程、线程、协程”

    本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...

  2. python 多线程和协程结合_如何让 python 处理速度翻倍?内含代码

    阿里妹导读:作为在日常开发生产中非常实用的语言,有必要掌握一些python用法,比如爬虫.网络请求等场景,很是实用.但python是单线程的,如何提高python的处理速度,是一个很重要的问题,这个问 ...

  3. python中多进程+协程的使用以及为什么要用它

    前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...

  4. 【Python 多线程vs协程】爬取西游记

    为了有效的学习和加深对于线程和协程的认知,将同一个任务用不同思路呈现很有帮助. 这里通过使用多线程以及协程两种方式对西游记的篇章内容进行爬取,来对比一下两者的耗时差异. 首先,多线程爬取. 这里没有限 ...

  5. python 多线程和协程结合_Python 异步编程,看这门课就够了~

    我们常见的 Linux.Windows.Mac OS 操作系统,都是支持多进程的多核操作系统.所谓多进程,就是系统可以同时运行多个任务.例如我们的电脑上运行着 QQ.浏览器.音乐播放器.影音播放器等. ...

  6. 并发并行多线程多进程协程

    并行(Parallelism) 并行是说同一时刻做很多操作.多进程是实现并行的有效方法.因为它可以将许多任务分配到计算机的多个核心上.多进程很适合计算密集型的任务,因为它充分地利用了多个CPU. 多进 ...

  7. 多线程多进程协程的区别和不同的应用场景

    当然既然是都是 多这个字开头,那么就是多任务,我们需要了解 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法, 实现⽤多个任务"⼀起"执⾏(实际上总有⼀些任务不在执 ...

  8. python 多线程和协程的区别

    一.共同点 都能进行多任务 二.不同点 协程是轻量级的线程,协程的运行依赖于线程,而线程的运行依赖于协程 共享全局变量问题: 协程: 共享全局变量不需要加锁,不会计算错误.对于全局变量,他的内存地址是 ...

  9. Python多线程多进程、异步、异常处理等高级用法

    文章目录 前言 多线程多进程 多线程 多进程 协程 总结 异步 基本概念 异步编程 asyncio aiohttp 异常 常见异常 异常处理 自定义异常 lambda表达式 lambda表达式用法 高 ...

最新文章

  1. 介绍一下linux系统的join 命令
  2. 储存卡怎么格式化为fat32_电脑复制文件到U盘提示文件容量太大该怎么办?
  3. 网站渗透测试,看这篇就够了
  4. Mybatis高级应用 多表关联查询
  5. 雷林鹏分享:CSS Id 和 Class
  6. 【教育】斯坦福开学演讲:为什么很多人顶级学校毕业,却终身平庸?
  7. php智能代码,php智能分页类代码原创
  8. 数据库SQL语言从入门到精通--Part 1--SQL语言概述
  9. 国科大学习资料--操作系统(杨力祥)--2015年思考题(含解答)
  10. html 弹出框 自动关闭,js提示框,n秒后自动关闭
  11. Java SE Lesson22_ClassLoader
  12. css 文本超出...
  13. php 检测是否是微信浏览器,PHP判断设备是否为微信浏览器或QQ浏览器
  14. 管程(Moniter) 并发编程的基本心法
  15. 微信html5电子相册,如何快速制作微信H5电子相册?
  16. CentOS 7 Docker安装GVM-11
  17. cocos中如何让背景模糊_Cocos Creator Shader Effect 系列 - 8 - 高斯模糊
  18. 世界杯期间怎么做营销活动?
  19. Android两种时间轴实现
  20. WIN7旗舰版下安装SQL SERVER 2008安装报错解决方案

热门文章

  1. Linux下配置bond0
  2. qq空间密码算法java_C#最新版QQ空间密码加密算法
  3. MATLAB 封装发布exe
  4. linux系统查看机器硬件信息,linux系统查看硬件信息的方法
  5. Bootstrap Collapse(手风琴)插件添加加减号、三角形图标
  6. iPhone 5s(A1528) ios9.3.3 成功使用联通4G
  7. Android SharedPreferences 首次运行引导界面
  8. 亚洲运动会简称亚运会,2022年的第19届在中国杭州举办,迎接亚运做一个线上健步走小程序活动,ElementById(“yayun“).innerHTML = “你好 亚运“;
  9. springcloud学习笔记---环境搭建--Linux下jdk安装
  10. php调用带验证的xfire,Xfire文件读取漏洞