Python档案袋( 进程与协程 )
Python的进程和线程是使用的操作系统的原生线程和进程,其是去调用操作系统的相应接口实现
进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程
线程:基于进程,之间可直接共享数据,可执行,只有所有的线程执行完毕程序才会退出
守护线程:生命值依赖于创建它的主线程,主程序亡,不管守护进程执行到何步也必须立即亡
多线程:不适用与CPU操作任务大的(如计算等),较适合于IO操作任务大的(如文件读写等)
进程
简单的进程
在Windows上启动进程必须加入【if __name__=="__main__":】,而在linux上则可随意,进程的使用基本与线程相同
import multiprocessing
import time def run11():
print("----- 进程 ----") # win 进程启动,必须加入这句
if __name__=="__main__":
#启动进程
t1=multiprocessing.Process(target=run11,args=())
t1.start()
进程间传递数据之进程队列:
import multiprocessing def run11(qqlistx):
print("****** 进入进程 ********")
#设置进程数据
qqlistx.put("") # win 进程启动,必须加入这句
if __name__=="__main__": #进程队列
qqlistx = multiprocessing.Queue() #启动进程,必须传递进程队列
t1=multiprocessing.Process(target=run11,args=(qqlistx,))
t1.start() print("得到进程数据:", qqlistx.get())
进程间传递数据之管道:
import multiprocessing def run11(pp1):
print("****** 进入进程 ********") #发送数据
pp1.send("东小东")
print("收到mian进程发来的数据:",pp1.recv()) # win 进程启动,必须加入这句
if __name__=="__main__": #得到管道
# 得到两端,如同socket的服务器和客户端
#任意一端都可以进行收发
pp1,pp2 = multiprocessing.Pipe() #启动进程,传递任意一端
t1=multiprocessing.Process(target=run11,args=(pp1,))
t1.start() #另一端接收数据
print("得到进程数据:", pp2.recv())
pp2.send("收到数据了东小东")
进程之数据共享:
两个进程进行数据共享,列表或者字典数据共享
import multiprocessing def run11(vv):
print("****** 进入进程 ********") vv["dong"]="dongxiaodong"
#vv.append("555") #列表 # win 进程启动,必须加入这句
if __name__=="__main__": #方法一 -------------:
# with multiprocessing.Manager() as mssaagex:
# dictx=mssaagex.dict() #得到字典参数
# #listx=mssaagex.list() #得到列表参数
#
# #启动进程,传递字典或者列表
# t1=multiprocessing.Process(target=run11,args=(dictx,))
# t1.start()
#
# #等待进程接收
# t1.join()
#
# #打印字典数据
# print("得到进程数据:", dictx) #方法二 -------------------:
dictx=multiprocessing.Manager().dict() #得到字典参数
#listx=multiprocessing.Manager().list() #得到列表参数 #启动进程,传递字典或者列表
t2=multiprocessing.Process(target=run11,args=(dictx,))
t2.start() #等待进程接收
t2.join() #打印字典数据
print("得到进程数据:", dictx)
进程锁:
可以保护屏幕打印等,如多个进程同时向屏幕输出数据时,可以保证屏幕数据来自于一个进程,不会出现数据混乱问题
import multiprocessing def run11(vv):
vv.acquire() #上锁
print("****** 进入进程 ********")
vv.release() #解锁 # win 进程启动,必须加入这句
if __name__=="__main__": lockx=multiprocessing.Lock() #得到进程锁 t2=multiprocessing.Process(target=run11,args=(lockx,))
t2.start()
进程池:
确定进程的同时运行个数,更好的进行进程管理
import multiprocessing
import time def run11(vv):
time.sleep(1)
print("****** 进入进程 ********",vv) #回调函数
#在主进程中运行
def Cal(arg):
print("每个进程的回调函数",arg) # win 进程启动,必须加入这句
if __name__=="__main__": poolx=multiprocessing.Pool(2) #得到进程池,最多同时执行2个进程 #启动进程
for i in range(10):
#poolx.apply_async(func=run11,args=(i,)) #并行
poolx.apply_async(func=run11,args=(i,),callback=Cal) #并行并加入执行完毕的回调函数
#poolx.apply(func=run11,args=(i,)) #串行 #等待并关闭进程
poolx.close()
poolx.join()
print("----- 完毕 -----")
协程:
单线程实现高并发
安装:pip3 install gevent
手动切换:
import greenlet def gfunx1():
print("----gfunx1---")
g2.switch() #手动切换到 gfunx2 中 def gfunx2():
print("---gfunx2----") #声明两个协程
g1=greenlet.greenlet(gfunx1)
g2=greenlet.greenlet(gfunx2) g1.switch() #手动切换到 gfunx1 中
自动切换:
默认是先运行完gfunx1然后再运行gfunx2,但当遇到IO操作则会自动跳转到另一个协程工作,以此实现在协程中遇到IO就互相切换执行的效果
import gevent def gfunx1():
print("---- gfunx1 ---")
gevent.sleep(3) #模拟 IO 操作为 3 秒,但使用time.sleep(x)则会进行阻塞
print("**** 三秒io操作结束 ******") def gfunx2():
print("---- gfunx2 ----") #开启两个协程
gevent.joinall([
gevent.spawn(gfunx1),
gevent.spawn(gfunx2),
])
自动切换进阶:
将一系列阻塞操作让协程识别为IO操作

import gevent
from gevent import monkey
#将所有的阻塞操作(如:网络,延时,文件等)都视为gevent可捕获的IO阻塞操作
#根据库作者提示:此句最好放在其它库import之前,否则会出现警告
monkey.patch_all() import requests
import time def gfunx1():
print("---- gfunx1 ---")
res=requests.get("https://img2018.cnblogs.com/blog/1485202/201811/1485202-20181116215233782-319594948.png")
open("ww.jpg","wb").write(res.content) #以二进制写文件
print("**** 网络操作结束 ******") def gfunx2():
print("---- gfunx2 ----")
time.sleep(3) #延时操作也已视为IO阻塞
print("*** 延时操作结束 3s ***") def gfunx3(varx):
print("---- gfunx3 ----",varx)
time.sleep(1)
print("*** 延时操作结束 1s ***") #开启三个协程
gevent.joinall([
gevent.spawn(gfunx1),
gevent.spawn(gfunx2),
gevent.spawn(gfunx3,"") #传递参数
])
Python档案袋( 进程与协程 )的更多相关文章
- python的进程/线程/协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
- python进阶——进程/线程/协程
1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...
- Python 线程&进程与协程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 多任务-python实现-进程,协程,线程总结(2.1.16)
@ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...
- Python中进程线程协程小结
进程与线程的概念 进程 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程.需要强调的是:同一个程序执行两次,那也是两个进程. 进程:资源管理单位(容器). 线程:最小执行单位,管理线程的是进程. ...
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
- Python之路【第七篇】:线程、进程和协程
Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- python运维开发(十一)----线程、进程、协程
内容目录: 线程 基本使用 线程锁 自定义线程池 进程 基本使用 进程锁 进程数据共享 进程池 协程 线程 线程使用的两种方式,一种为我们直接调用thread模块上的方法,另一种我们自定义方式 方式一 ...
- Python 线程和进程和协程总结
Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
随机推荐
- PHP递归获取二维数组中指定key的值
$data = [ "resulterrorCode" => 0, "resultraw" => [ "result" => ...
- Flink+kafka实现Wordcount实时计算
1. Flink Flink介绍: Flink 是一个针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.目前主要还是依靠开源社区的贡献而发展.对 Flink 而言,其所要处理的主要场 ...
- java集合遍历的几种方式总结及比较
集合类的通用遍历方式, 用迭代器迭代: Iterator it = list.iterator(); while(it.hasNext()) { Object obj = it.next(); } ...
- 关于spring aop Advisor排序问题
关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序,这时候可以用注解org.springframework.core.annotation.Order或 ...
- MongoDb安装和快速入门
1.Mongodb安装 2.mongodb的增删改查 3.MongoDB数据类型 4.Mongodb $关键字 $修改器 5.MongoDB 之 "$" 的奇妙用法 6.Mongo ...
- LevelDB C API 整理分类
// 结构体列表 typedef struct leveldb_t leveldb_t; // 数据库 typedef struct leveldb_cache_t leveldb_cache_t; ...
- FlowerVisor理解
Ï来自FlowVisor: A Network Virtualization Layer这篇论文的理解 1. 简介 论文讲述如何虚拟化一个网络,并描述一个特殊的系——FlowVisor 网络虚拟化用来 ...
- idea在springboot项目中没有【新建JSP选项】的解决方法
https://blog.csdn.net/qq_26525215/article/details/53726690 转载于CSDN
- MyBatis(九) 使用association定义单个对象的封装规则
(1)接口中编写方法 public Emp getEmpandDept(); (2)编写Mapper文件 <resultMap type="com.eu.bean.Emp" ...
- SpringBoot几种定时任务的实现方式
定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, ...