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. [转] Vue中异步错误处理

    一般在一个项目开始之前,我们一般会对现有的框架做一定功能上的丰富,比如对ajax请求功能的二次封装,封装的功能可能包含了:通用错误处理,请求过滤,响应过滤等等.如果我们封装的函数叫request,那么 ...

  2. redis安装使用

    Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 它通常被称为数据结构服务器,因为值(valu ...

  3. [python][cpp]对浮点数进行n位翻转

    问题 在py编程中,碰到一个小问题,如何把一个浮点数按位反转,这个问题说大不大,说小不小,一开始觉得很容易,后来仔细考虑了一下,没有想像的那么简单. 思路 按照一般的python解决思路,肯定是寻找相 ...

  4. Excel—错误解释

       1.#####! 如果单元格所含的数字.日期或时间比单元格宽,或者单元格的日期时间公式产生了一个负值,就会产生#####!.这个看起来比较简单,大家应该都了解吧. 解决方法:如果单元格所含的数字 ...

  5. TMS320DM642学习----第六篇(CCS中.dat文件类型详解)

    1.如下为.dat文件中文件头的基本格式: MagicNumber Format StartingAddress PageNum Length [NewFormat] 下面是分别的解释: MagicN ...

  6. ImCash:币圈英文术语大全

    近年来随着数字货币的火热,在全世界范围内涌现出了一群数字货币的“发烧友”和忠实投资者,他们形成了自己的圈子“币圈”,并且有了自己的文化和语言,今天就让我们一起来了解一下外国币圈有哪些有意思的英文“专用 ...

  7. 如何快速求解第一类斯特林数--nlog^2n + nlogn

    目录 参考资料 前言 暴力 nlog^2n的做法 nlogn的做法 代码 参考资料 百度百科 斯特林数 学习笔记-by zhouzhendong 前言 首先是因为这道题,才去研究了这个玩意:[2019 ...

  8. windows server 远程桌面连接问题。

    远程桌面连接相当于 linux 服务器root权限连接 mstsc /admin /v:目标IP mstsc /admin /

  9. 洛谷P3802:小魔女帕琪

    题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从而唱出强力的魔法.比如说 ...

  10. 关于部署php遇到的坑

    业务突然要启动一个久不使用的PHP项目, 发现部署到centos7上后 各种报错 就是不行. 我怀疑是apache或者php问题 就重新安装 编译安装也试过就是不行. 只能按笨办法 在测试环境安装了a ...