python进程概要
进程
狭义:正在运行的程序实例。
广义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,他是操作系统动态执行的基本单元。
python的进程都是并行的。
并行:两个进程同时执行一起走。
并发:逻辑上是两个线程同时进行,物理上是交替执行。
import multiprocessing def fun1(i):
print(multiprocessing.current_process(),i) if __name__ == "__main__":
mp_lst = []
for i in range(100):
m = multiprocessing.Process(target=fun1,args=(i,))
m.start()
mp_lst.append(m) _ = [i.join() for i in mp_lst]
简单开启100个进程
python进程和线程的使用方式没啥区别
start() 开启进程
join() 等待,直到进程完成其工作并退出位置
为什么要使用__name__ == "__mian__"呢?
因为进程再创建时要导入目标函数的脚本,使用__name__ == "__mian__"方式来防止无限递归。
如果目标函数不在和开启进程同一个脚本中就不需要使用。
class Process(): # TODO: set type of group to None
def __init__(self,
group: Any = ...,
target: Optional[Callable] = ..., #函数
name: Optional[str] = ..., #进程名
args: Iterable[Any] = ..., #参数
kwargs: Mapping[Any, Any] = ...,
*,
daemon: Optional[bool] = ...) #是否在后台运行进程
def start(self) #开启进程
def run(self) #目标函数
如何在后台运行进程
python没有守护进程,没有守护进程,没有守护进程 说三遍。
后台进程是一种典型的耗时执行模式,他不需要人为干预,但是可以与其他程序并发,python通过设置daemon选项设置后台进程。
后台进程不能有子进程,因为后台进程的父进程退出时它会终止,如果有子进程那么子进程就会变成游离状态。
import multiprocessing class MyProcess(multiprocessing.Process):
def __init__(self):
super(MyProcess, self).__init__() def run(self):
print(self.name) a = MyProcess()
a.daemon = True #设置后台进程
a.start()
后台进程简单应用
杀死进程
class MyProcess(multiprocessing.Process):
def __init__(self):
super(MyProcess, self).__init__() def run(self):
print(self.name) a = MyProcess() a.start() a.terminate() #杀死进程
time.sleep(5)
print(a.is_alive()) #判断进程存活
a.join()
杀死进程示例
进程不会被立刻杀死,需要一定时间。
p.exitcode 状态码
==0:表示没有错误
>0:表示进程遇到了错误并退出。
<0:表示进程被信号杀死了。
进程锁与递归锁同线程
信号量、事件都和线程一样
进程同步
python 3.2新增特性屏障barrier
import multiprocessing
from multiprocessing import Process,Barrier,Lock
import time def fun1(br,lockto):
br.wait() #屏障阻塞
now = time.time()
with lockto: #利用with获取和释放锁
print(multiprocessing.current_process().name,now) def fun2():
now = time.time()
print(multiprocessing.current_process().name,now) if __name__ == "__main__":
br = Barrier(2) #设置屏障要阻塞几个进程
lockto = Lock()
p1 = Process(target=fun1, args=(br, lockto), name="p1_prosess")
p2 = Process(target=fun1, args=(br, lockto), name="p2_prosess")
p3 = Process(target=fun2, name="p3_prosess")
p4 = Process(target=fun2, name="p4_prosess")
p1.start()
p2.start()
p3.start()
p4.start()
p1.join()
p2.join()
p3.join()
p4.join() 输出:
p3_prosess 1562118519.9697998
p2_prosess 1562118519.9697998
p1_prosess 1562118519.9697998
p4_prosess 1562118519.9768193
我们可以看到p1和p2的时间是完全相同的至于p3为什么也相同=。=俺电脑太棒了只能说,多测试几遍就有不同的值了不贴了。
这个屏障的作用就是wait阻塞住以后按照前面设置的阻塞进程的数量来拦截进程,我这里设置的是2个所以就第一个进程到达时阻塞直到第二个进程到达才一起释放。如下图:
利用进程管理器进行数据共享
import multiprocessing def fun1(mg_dict,x,y):
mg_dict[x] = y if __name__ == "__main__":
mg = multiprocessing.Manager() #生成管理器对象
mg_dict = mg.dict() #创建共享字典 p_lst = [multiprocessing.\
Process(target=fun1,args=(mg_dict,i,i*2)) for i in range(10)] [p.start()for p in p_lst]
[task.join()for task in p_lst] print(mg_dict)
利用管理器共享数据
如果要访问数据也要加锁奥~
进程间通信
可以使用管道、队列
这里最主要想说是一个mpi4py的python模块,可以进行进程的点对点、广播、拓扑(订阅发布)的方式通信,但是一般大家都用rabitmq,不知道有没有必要写,我可以利用这个模块做什么呢?
可以使用他造轮子吗?但是有rbitmq这些还有必要造吗?有什么意义?感觉灵活度也不是很高。可以利用他再写一个类似celery的轮子?我觉得celery是可以重写因为大部分功能都用不上,减轻负重也不错。
python进程概要的更多相关文章
- python——进程基础
我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...
- 使用gdb调试Python进程
使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...
- python进程、线程、协程(转载)
python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资 ...
- Python进程、线程、协程详解
进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...
- python进程池剖析(一)
python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...
- python——进程、线程、协程
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...
- python/进程线程的总结
python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...
- python 进程介绍 进程简单使用 join 验证空间隔离
一.多道程序设计技术(详情参考:https://www.cnblogs.com/clschao/articles/9613464.html) 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行 ...
- Python 进程之间共享数据
最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享 在mp库当中,跨进程对象共享有三种方式,第一种 ...
随机推荐
- 百万年薪python之路 -- 推导式
2.1列表推导式 首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10: li = [] for i in range(1,11): li.append(i) print(li) ...
- 收藏收藏:时隔一年,你关注的打造一个实用的TXT文本操作及日志框架,我们开源了,不再为程序写日志发愁(也支持.net core哦)
记得做这个框架是在2018年刚接触.net core的时候,那个时候为了能够专心的研究我开始不写博客了,但是学有所成并在公司运用了近一年的时间了,决定回来和各位分享我们所掌握的那星星点点的知识,希望可 ...
- Git 项目提交新仓库
提示:进入项目文件操作 步骤: 1.git init ----------初始化git仓库 2.git remote add origin 你的项目地址 ------------------如: ...
- 史上最骚最全最详细的IO流教程,没有之一!
目录 1.告白IO流的四点明确 2.File类 1.1 File概述 1.2 构造方法 1.3 常用方法 1.3.1 获取功能的方法 1.3.2 绝对路径和相对路径 1.3.3判断功能的方法 1.3. ...
- 两行代码玩转SUMO!
两行代码玩转SUMO! 这篇博客很简单,但是内容很丰富 如何生成如下所示的研究型路网结构? 只需要打开ubuntu终端输入如下代码即可,grid.number代表路口数量,grid.length代表路 ...
- 设计模式(十三)Visitor模式
Visitor模式可以用来把数据结构与处理分离开.通俗来说就是编写一个访问者类来访问数据结构中的元素,并把对各元素的处理交给访问者类.这样,当需要增加新的处理时,只需要编写新的访问者,然后让数据结构可 ...
- docker入门级详解
Docker 1 docker安装 yum install docker [root@topcheer ~]# systemctl start docker [root@topcheer ~]# mk ...
- SSM简易版
技术准备 Java: 基础知识 框架: Spring,SpringMVC,Mybatis 数据库: Mysq 开发工具: Eclipse,Maven 项目结构 数据库设计 创建数据库:student ...
- WebApi -用户登录后SessionId未更新
描工具检测出.net的程序有会话标识未更新这个漏洞 用户尚未登录时就有session cookie产生.可以尝试在打开页面的时候,让这个cookie过期.等到用户再登陆的时候就会生成一个新的sessi ...
- UVA12433 【Rent a Car】
这题应该算是比较难的一道网络流的题,(但却在我校OJ考试上出现了),但是大家只要能理解此图的建边方式就行. 假设有5天的租车需求,虚拟出2*n+2 即 12个节点,0为源点,12为汇点. 1,源点到1 ...