Python中的进程
进程
from multiprocessing import Process
import time
def start(name):
time.sleep(1)
print('hello', name)
if __name__ == '__main__':
# 开辟一个进程
p = Process(target=start, args=('zhangsan',))
# 再开辟一个进程
p1 = Process(target=start, args=('lisi',))
p.start()
p1.start()
p.join()
进程间通讯,每个进程都有自己的内存空间,因此不同进程内存是不共享的,要想实现两个进程间的数据交换,有几种方法
Queue(队列)
def start(q):
q.put('hello')
if __name__ == '__main__':
q = Queue()
p = Process(target=start, args=(q,))
p.start()
print(q.get())
p.join()
Pipe(管道)
把管道的两头分别赋给两个进程,实现两个进程的互相通信
def start(left_conn):
right_conn.send('你好') # 发送
print(right_conn.recv()) # 接收
right_conn.close()
if __name__ == '__main__':
left_conn, right_conn = Pipe() # 生成管道
p = Process(target=start, args=(right_conn,))
p.start()
print(left_conn.recv()) # 接收
left_conn.send('你也好') # 发送
p.join()
左管道发送,右管道接收,随后右管道返回消息,左管道接收,关闭管道
Manager实现了进程间真正的通信共享
from multiprocessing import Process, Manager
def f(dic, i):
dic[i] = i
if __name__ == '__main__':
manager = Manager()
dic = manager.dict() # 通过manager生成一个字典
p_list = []
for i in range(10):
p = Process(target=f, args=(dic, i))
p.start()
p_list.append(p)
# 等待所有进程执行完毕
for res in p_list:
res.join()
print(dic)
进程池
进程池内部维护一个进程序列,当使用时,则去进程池获取一个进程,如果进程池序列中没有可以使用的进程,那么程序就会等待,直到进程池中有可用进程为止。
from multiprocessing import Process, Pool
import time
def Foo(i):
return i + 100
def Bar(arg):
print('number:', arg)
if __name__ == '__main__':
pool = Pool(3) # 定义一个进程池,里面有3个进程
for i in range(10):
# callback是回调函数,就是在执行完Foo方法后会自动执行Bar函数,并且会把Foo函数的返回值作为参数传入Bar参数
pool.apply_async(func=Foo, args=(i,), callback=Bar)
# 必须先关闭进程池,在关闭进程池中的进程
pool.close()
# 等待进程池中的进程结束后关闭
pool.join()
程序会一次拿出来三个从池子里,直到没有
from greenlet import greenlet
import time
def test1():
print('---aaa---')
time.sleep(1)
gr2.switch()
print('---bbb---')
time.sleep(1)
gr2.switch()
def test2():
print('-----ccc-----')
time.sleep(1)
gr1.switch()
print('-----ddd-----')
while 1:
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
协程
微线程,协程能保留上次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
协程有极高的执行效率,因为子程序切换不是线程切换,而是自身控制,因此,没有线程切换的开销。
不需要多线程的锁机制,因为它本身只有一个线程,只需要判断状态就好,所以效率高
因为协程是一个线程进行,所以想要利用多核CPU,就是多进程加协程
符合协程的条件:
- 必须在只有一个单线程里并发
- 修改共享数据不需要加锁
- 用户程序里自己保存多个控制流的上下文
- 一个协程遇到IO操作自动切换到其他协程
python的两个协程模块:
- greenlet(执行顺序需要手动控制)
from greenlet import greenlet
import time
def test1():
print('---aaa---')
time.sleep(1)
gr2.switch()
print('---bbb---')
time.sleep(1)
gr2.switch()
def test2():
print('-----ccc-----')
time.sleep(1)
gr1.switch()
print('-----ddd-----')
while 1:
gr1 = greenlet(test1)
gr2 = greenlet(test2)
print('开始启动')
gr1.switch()
手动切换协程,当运行到aaa,切换到ccc,再次切换回去,并且会记录上一次执行完aaa的位置,会从bbb开始执行,如此循环下去,就会出现如下图所示的结果
Python中的进程的更多相关文章
- python中的进程、线程(threading、multiprocessing、Queue、subprocess)
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- python中的进程池
1.进程池的概念 python中,进程池内部会维护一个进程序列.当需要时,程序会去进程池中获取一个进程. 如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用进程为止. 2.进程池 ...
- python中的进程池:multiprocessing.Pool()
python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理.进程池:利用multiprocessing 下的Pool ...
- 第十五章、python中的进程操作-开启多进程
目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...
- Python中的进程池与线程池(包含代码)
Python中的进程池与线程池 引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用su ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
- Python 中的进程与 锁
理论知识 操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操 ...
- 深入理解Python中的进程
1.进程的概念什么是进程—>CPU在同一时刻只能处理一个任务,只是因为cpu执行速度很快. cpu在各个任务之间来回的进行切换. 进程的概念:正在进行的一个过程或者说一个任务,而负责执行任务的则 ...
- python中的进程池和线程池
Python标准模块-concurrent.futures #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ...
随机推荐
- (转)android 中uri.parse()用法
1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...
- Spark-RPC理解
基本架构 Akka Actor式RPC架构 Spark采用的是AkkaActor架构实现RPC,但是实际使用过程为了兼容不同节点之间的文件下载,采用Netty来实现Actor功能. Spark RPC ...
- git push时报错refusing to merge unrelated histories
1. 删除本地项目中的.git目录,然后向远程仓库提交代码的时候,重新配置后再次提交.会有冲突. 解决方式: git remote add origin [//your giturl] git pul ...
- 正确的学python方式
首先呢,和其他的各种学习都一样,你一定要明白你学习的目标是什么.有的人想要通过学习Python,转行成程序员,实现行业上的转变:有的人希望通过学习Python,在现有的岗位上提升自己:当然也有很多人只 ...
- [Unity优化]批处理02:动态批处理
参考链接: https://docs.unity3d.com/Manual/DrawCallBatching.html 原理: cpu每帧把可以进行动态批处理的网格进行合并,再把合并后的数据传给gpu ...
- php进阶--菜鸟之路
希望有所帮助! 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的PHP开发:能够在P ...
- 使用 nodeJs 开发微信公众号(配置服务器)
流程如下: 1. 申请微信公众号:企业号.服务号.订阅号(前两个要钱) 2. 配置微信公众号后台 选择基本配置,获得 AppId 和 AppSecret ,点击服务器配置 URL:你服务器地址,不能是 ...
- 教你快速录制gif动图
我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事 ...
- MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)(转)
1. MySQL莫名变成了 Strict SQL Mode 最近测试组那边反应数据库部分写入失败,app层提示是插入成功,但表里面里面没有产生数据,而两个写入操作的另外一个表有数据.因为 insert ...
- HTML: Dom event
转自:https://developer.mozilla.org/zh-CN/docs/Web/API/Event Event接口表示在DOM中发生的任何事件; 一些是用户生成的(例如鼠标或键盘事件) ...