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档案袋( 进程与协程 )的更多相关文章

  1. python的进程/线程/协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  2. python进阶——进程/线程/协程

    1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...

  3. Python 线程&进程与协程

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  4. 多任务-python实现-进程,协程,线程总结(2.1.16)

    @ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...

  5. Python中进程线程协程小结

    进程与线程的概念 进程 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程.需要强调的是:同一个程序执行两次,那也是两个进程. 进程:资源管理单位(容器). 线程:最小执行单位,管理线程的是进程. ...

  6. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  7. Python之路【第七篇】:线程、进程和协程

    Python之路[第七篇]:线程.进程和协程   Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  8. python运维开发(十一)----线程、进程、协程

    内容目录: 线程 基本使用 线程锁 自定义线程池 进程 基本使用 进程锁 进程数据共享 进程池 协程 线程 线程使用的两种方式,一种为我们直接调用thread模块上的方法,另一种我们自定义方式 方式一 ...

  9. Python 线程和进程和协程总结

    Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位: 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其 ...

  10. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

随机推荐

  1. Springboot @Transactional Mysql事务 无效

    JPA默认创建的表是MyISAM引擎,MyISAM引擎不支持事务操作 所以需要将将数据库引擎改为InnoDB 配置修改 spring.jpa.database-platform=org.hiberna ...

  2. Python2.7和3.7区别

    区别一:print语法使用 Python2.7   print语法使用   >>> print "Hello Python" Python3.7   print语 ...

  3. pwn学习之三

    whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...

  4. Git是什么、Git的功能、为什么versioncontrol用Git、Git的常用命令、Git的优缺点

    Git是什么 git是目前世界上最先进的分布式版本控制系统(没有之一). Git是用于 Linux内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版 ...

  5. wpa_cli 关联无线网络

    fq关联无线网络,不同的无线网络认证方式不同设置:    1)open(开放式认证方式,分为):         wpa_cli -iwlan0 set_network 0 ssid '"w ...

  6. linux系统做raid

    raid 常用步骤 1.ctrl+R 进入raid设置界面 2.F2 相当于右键功能 3.箭头 → 是下一个选项功能 4.ctrl+n是下一页,ctrl+p是前一页 5.Esc退出.最后ctrl+al ...

  7. IaaS,PaaS和SaaS

    云计算的三种服务模式:IaaS,PaaS和SaaS IaaS: Infrastructure-as-a-Service(基础设施即服务)是第一层. PaaS: Platform-as-a-Servic ...

  8. React+Ant Design设置左侧菜单导航路由的显示与隐藏(与权限无关)

    最近在学习react时,用到了很流行的UI框架Ant Design,也了解了一下Ant Design Pro,发现它们都有导航组件,Ant Design框架的导航菜单在这里,Ant Design Pr ...

  9. numpy地址

    pip安装  http://zhidao.baidu.com/link?url=nkRwDOZ1ALMjRsWHGMR1nLSIyuVycoD4j-mhGDsYptPwDRGYcE8u4_B9VvYk ...

  10. 4.24Linux(4)

    2019-4-24 21:35:13 学完了Linux装python编译安装感觉有种控制电脑的感觉!感觉好爽!!!! 主要是Linux用习惯就感觉好爽!!! 越努力,越幸运!永远不要高估自己!! 等学 ...