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. requireJS简单应用

    项目结构目录: Html页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> < ...

  2. ISP基本框架及算法介绍

    什么是ISP,他的工作原理是怎样的? ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为 ...

  3. thinkPHP实现APP微信支付

    控制器 class Pay extends Controller { const WX_PAY_URL = "https://api.mch.weixin.qq.com/pay/unifie ...

  4. 使用chrome-devtools定位元素

    2.1使用chrome-devtools 这是谷歌提供的一个移动端Web开发调试工具,通过它我们可以调试手机页面.通过调试我们可以看到wap页面的源码,从而进行元素的定位.那么这个工具该如何使用呢?首 ...

  5. Android进阶:六、在子线程中直接使用 Toast 及其原理

    一般我们都把Toast当做一个UI控件在主线程显示.但是有时候非想在子线程中显示Toast,就会使用Handler切换到主线程显示. 但是子线程中真的不能直接显示Toast吗? 答案是:当然可以. 那 ...

  6. 【spring】-- springboot配置全局异常处理器

    一.为什么要使用全局异常处理器? 什么是全局异常处理器? 就是把错误异常统一处理的方法. 应用场景: 1.当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句 ...

  7. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)

    1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...

  8. [CF1093E]Intersection of Permutations

    [CF1093E]Intersection of Permutations 题目大意: 给定两个长度为\(n(n\le2\times10^5)\)的排列\(A,B\).\(m(m\le2\times1 ...

  9. Linux网络文件系统的实现与调试

    NFS协议 NFS (网络文件系统)不是传统意义上的文件系统,而是访问远程文件系统的网络协议.整个NFS服务的TCP/IP协议栈如下图所示,NFS是应用层协议,表示层是XDR,会话层是RPC,传输层同 ...

  10. Do-Now—团队冲刺博客三

    Do-Now-团队 冲刺博客三 作者:仇夏 前言 不知不觉我们的项目已经做了三个多礼拜了,团队冲刺博客也写到了这第三篇,看着一个基本成型的APP安装在自己的手机上,一种喜悦感油然而生.好了,现在来看看 ...