python学习之j进程和线程:
每个进程至少有一个线程,python因为每个线程都共用一个GIL全局锁(同时只能运行一个线程),所以不能用多线程(除非重新写C解释器),但是多进程的GIL锁各自独立可多进程。
进程与线程的区别在于一个变量在多线程中都可改变相互影响可通过互斥锁来解决。而多进程相当于各有一个拷贝互不影响。
多进程比较消耗系统资源,但稳定性高。
多线程:速度快,但稳定性不高
计算密集型和IO密集型任务:
计算密集型,任务越多效率越低,适合效率高的C语言
IO密集型:因为任务与MCU存在速度上的巨大差异,单任务的等待会消耗大量的无效MCU时间。如果任务越多并发执行,效率越高,适合开发效率较高的python语言。但为了避免死等可以用异步的’协程‘提高对异步事件驱动型的响应
分布式进程:Python 的 multiprocessing 模块不但支持多进程,其中 managers 子模块还支持把多进程分布到多台机器上 ,注意,当我们在一台机器上写多进程程序时,创建的 Queue 可以直接
拿来用,但是,在分布式多进程环境下,添加任务到 Queue 不可以直接对原始的 task_queue 进行操作,那样就绕过了 QueueManager 的封装,必须通过 manager.get_task_queue()获得的 Queue 接口添加
一 相关模块:threading, multiprocessing
1.1 创造线程t1 = threading.Thread(target=run_thread, args=(5,))
执行线程:t1.start()
等待线程结束:t1.join()若不能结束则需强制结束.terminate(), 属性threading.current_thread().name
二互斥锁:lock = threading.Lock(),申请:lock.acquire();释放:lock.release()
三 多线程共享数据:互斥信号量ThreadLocal,
3.1 定义 local_school = threading.local()
3.2 使用:在各模块中修改local_school.object
四:协程:协程相当于加了中断功能的子程序,子程序有一个入口一个出口,出来了才能干其它事情,而协程是利用genarator生成器(generator 中,我们不但可以通过 for 循环来迭代,还可以不断调用
next()函数获取由 yield 语句返回的下一个值
),而在协程里yeil不但可以返回一个值,它还可以接收调用者发出的参数
,在生产消费者类型里面,生产者通过一个一个生成器传参数r = c.send(n) ,而消费者通过n =yeid r或的参数,并修改r参数,然后又回到生产者中调用r.
4.1异步IO协程(并发完成):asyncio (Python 3.4)提供了完善的单线程异步 IO 并发操作支持,在客户端的意义不大但在服务器中则非常好用,asyncio 实现了 TCP、 UDP、 SSL 等协议, aiohttp(须安装) 则是基于 asyncio 实
现的 HTTP 框架
;异步操作需要在 coroutine 中通过 yield from 完成;多个 coroutine 可以封装成一组 Task 然后并发执行;为了简化并更好地标识异步 IO,从 Python 3.5 开始引入了新的语法 async
和 await,可以让 coroutine 的代码更简洁易读
,只是些语法替换。
import asyncio
@asyncio.coroutine
#用async 替代在def前
def func(host):
yied from #用await替代。
loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com',
'www.163.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
最新文章
- C语言中的sizeof()
- Scala相关
- git无法定位程序输入点libiconv
- 机器学习利器——Scikit-learn的安装
- python执行linux shell管道输出内容
- JavaWeb---总结(八)HttpServletResponse对象(二)
- 我所理解的JavaScript闭包
- 10月26日 奥威Power-BI基于微软示例库(MSOLAP)快速制作管理驾驶舱 腾讯课堂开课啦
- 我给女朋友讲编程html系列(3) --html中的超链接标签-a标签 和 框架frame与框架集frameset
- App接口设计原则-b
- js监控键盘大小写事件
- elasticsearch 索引 red 状态恢复 green
- gitlab 添加SSH Key
- Spring 并发访问的线程安全性问题
- uboot引导linux内核过程详解【转】
- Python处理Excel生成CSV文档
- ADT Android开发环境搭建小记
- golang 二进制转十进制实现方式
- hdoj4859海岸线
- Win10无法访问网上邻居电脑共享的文件夹怎么办
热门文章
- zabbix 用户自定义监控参数添加
- 配置maven环境变量并安装jar包到本地仓库
- RightScale发布2017年度云调查报告
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
- windows下多进程加协程并发模式
- poj2728 Desert King——01分数规划
- kafka之六:为什么Kafka那么快
- 三、mysql登录详解及版本号查询
- Windows 下有什么软件能够极大地提高工作效率
- stdout引发的curl 302跳转 crash