程序

程序:编写完的代码称为程序。

进程

进程:又称重量级进程,正在执行中的程序称为进程。进程的执行会占用内存等资源。多个进程同时执行时,每个进程的执行都需要由操作系统按一定的算法(RR调度、优先数调度算法等)分配内存空间。

并行与并发

并行:在多核系统中,每个cpu执行一个进程,可以理解为cpu的数大于进程数,所有进程同时进行。

并发:在操作系统中同时执行多个进程,可以理解为cpu的数小于进程数,有些进程会没有机会执行。

并发与并行的区别:并行指两个或多个程序在同一时刻执行;并发指两个或多个程序在同一时间间隔内发生,可以理解为在表面上看是同时进行,但在同一时刻只有少于程序的总数的程序在执行,计算机利用自己的调度算法让这些程序分时的交叉执行,由于交换的时间非常短暂,宏观上就像是在同时进行一样。

多进程

  在python中,每一个运行的程序都有一个主进程,可以利用模块中封装的方法来创建子进程。

1、利用os模块中的fork()来创建子进程

import os, time

pid = os.fork()
print("外面的pid",pid)
if pid == :
print("子进程中的程序")
print("子进程的pid=", os.getpid())
print("父进程的pid=", os.getppid()) elif pid > :
print("父进程中的程序")
print("子进程的pid=", os.getpid())
print("父进程的pid=", os.getppid()) else :
print("创建失败")

解释:

os.fork():os模块中用来创建子进程的方法,当程序执行到os.fork()时,操作系统会将当前的进程复制一份,原来的进程称为父进程,新创建的进程称为子进程,两个进程会各自互不干扰的执行下面的程序,父进程与子进程的执行顺序与系统调度有关。父进程与子进程都会在os.fork()中得到一个返回值,子进程的返回值为0,父进程的返回值为子进程的进程号,这个值永远大于零,具体数值由操作系统分配,如果返回值为负数则表明创建子进程失败。

os.getpid():获取进程的进程号。

os.getppid():获取父进程的进程号。

注意:这个os.fork()方法只有在unix系统中才会有,在window下没有。

2、利用multiprocessing模块Process类创建进程

在multiprocessing模块中提供一个Process()类来创建进程,直接上代码:

from multiprocessing import Process
import time def test(a):
for i in range(a):
print("子进程...")
time.sleep(1) p = Process(target=test,args=(5,))
p.start()
p.join(2)
while True:
print("父进程...")
time.sleep(1)

解释:

这里的p相当于Process类的一个实例对象,每实例化一个对象就是创建一个子进程。

target = test :子进程所执行的任务,就是test这个函数

args = (5,)  :给进程函数传参,这里需要用元祖的方式进行传参

p.start() :执行子进程,只用调用start()方法,子进才会执行

p.join(n)  :让主进程等待n秒钟

在进程结束后,主进程会等待子进程先结束,如果主进程先结束,那么所有的子进程都会结束。

Process常用的方法:

start():启动进程

is_alive() :判断进程是否还在执行,返回True 或 False

join(n) : 主进程等待子进程,n为等待的时间(秒)

run() :在调用start方法时会自动调用run()方法,可以创建Process类的子类来重写run()方法的方式创建进程

terminate():使进程立即终止

3、利用Process类的子类来创建进程

from multiprocessing import Process
import time class NewProcess(Process):
def __init__(self,num):
self.num = num
super().__init__() def run(self):
print("开始重写run了")
i = 0
while True:
time.sleep(1)
i += 1
print("子进程",i)
if i == self.num:
break p = NewProcess(6)
p.start()
p.join(2)
while True:
if p.is_alive():
print("父进程")
time.sleep(1)
elif not p.is_alive():
print("子进程结束了")
break

这个方法核心就是创建一个Process类的子类,利用重写run()方法来实现任务的添加。

4、利用multiprocessing模块进程池Pool创建进程

Process类适合用于创建所需进程数量不多的情况,如果需要创建大量的进程,则需要利用进程池来创建进程。

from multiprocessing import Pool
import time
import os def work(i):
time.sleep(1)
print(i,"当前程序的pid=",os.getpid())
def work1(i):
time.sleep(1)
print(i,"当前程序的pid=",os.getpid()) def work2(i):
time.sleep(1)
print(i,"当前程序的pid=",os.getpid())
# 创建进程池
pool = Pool(2)
# 使进程开始执行
pool.apply_async(work,(1,))
pool.apply_async(work1,(2,))
pool.apply_async(work2,(3,))
pool.apply(work1,(4,))
pool.apply(work2,(5,))
pool.apply(work1,(6,))
pool.apply(work2,(7,))
# 关闭进程池
pool.close()
# 让主进程等待子进程
pool.join()

解释:

pool = Pool(2)为创建一个进程池,进程池中同时开两个进程,如果任务多于进程数时,进程会逐个执行任务,当一个进程完成任务后,接着执行待完成的任务,直到所有任务全部完成。

pool.apply_async(func,args) :非堵塞式,异步执行。func调用的为任务,args:为func传参,参数以元祖的方式传递。

pool.apply(func,args) :堵塞式执行。进程会等待上一个进程结束才会进行。传参同上。

pool.close() :关闭进程池,停止向进程池中添加任务

pool.join()  :使主进程等待。必须在close()或者terninate()后面使用。

Python中进程的更多相关文章

  1. python中进程间通讯——文件锁之fcntl模块的使用

    python 中给文件加锁——fcntl模块import fcntl 打开一个文件##当前目录下test文件要先存在,如果不存在会报错.或者以写的方式打开f = open('./test')对该文件加 ...

  2. day 27 Python中进程的操作

    进程的创建和结束: multiprocess模块: multiprocess不是一个模块而是python中一个操作.管理进程的包 分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享 ...

  3. python中进程、线程、协程简述

    进程 python中使用multiprocessing模块对进程进行操作管理 进程同步(锁.信号量.事件) 锁 —— multiprocessing.Lock 只要用到了锁 锁之间的代码就会变成同步的 ...

  4. Python中进程和线程的总体区别

    Num01–>线程 线程是操作系统中能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一个线程指的是进程中一个单一顺序的控制流. 一个进程中可以并发多条线程,每条线程并行 ...

  5. python中进程池的应用

    #原创,转载请联系 假设我们写的一个程序需要运行100个子进程的时候,那么写程序时,不可能循环创建销毁100个进程吧?进程的创建与销毁是很耗系统的资源的. 进程池的作用就体现出来了. 进程池可以控制进 ...

  6. python中进程池和回调函数

    一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...

  7. python中进程详解

    1:pdb调试:基于命令行的调试工具,非常类似gnu和gdb调试,以下是常用的调试命令: 可以python -m pdb xxx.py(你的py文件名)进入命令行调试模式 命令 简写命令 作用 bea ...

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

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

  9. Python中进程无法结束的处理办法

    1.方法一    http://hi.baidu.com/javalang/item/72fabf2359a30b464799625e 也就是说当线程使用start方法运行起来后,只有当run方法运行 ...

随机推荐

  1. BZOJ 2653: middle [主席树 中位数]

    传送门 题意: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右 ...

  2. 介绍一个轻量级iOS安全框架:SSKeyChain

    SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码.账户进行访问,包括读取.删除和设置.SSKeyChain的作者是大名鼎鼎的SSToolkit的作者samsoffes ...

  3. php 下载保存文件保存到本地的两种实现方法

    这里的下载,指的是 弹出下载提示框. 第一种: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php function downfile() {  $filename ...

  4. 利用ajax获取网页表单数据,并存储到数据库之一(使用JDBC)

    所谓JDBC就是利用java与数据库相连接的技术,从数据库获取既有的信息或者把网页上的信息存储到数据库. 这里简单的介绍公司的一个小项目中的一部分,由于代码较多,所以用图片形式进行展示.源码请查看源码 ...

  5. 重绘(redraw或repaint),重排(reflow)

    浏览器运行机制图: 浏览器的运行机制:layout:布局: 1.构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树(Co ...

  6. 编程中&和&&的区别

    逻辑电路中用&: 与门电路,全真为真,有假为假. 编程中:&表示取地址符(C)和 按位与(非bool类型时,转换成二进制,按位与运算). &&表示逻辑与运算,& ...

  7. Spring boot 整合mybatis

    第一步:创建maven项目并添加spring boot依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  8. 【转载】什么是Windows USB设备路径,它是如何格式化的?

    http://blog.csdn.net/kingmax54212008/article/details/77837210 用于接口的复合USB设备路径格式 \?usb#vid_ vvvv&p ...

  9. ZOJ - 2477 dfs [kuangbin带你飞]专题二

    注意输入的处理,旋转操作打表.递增枚举可能步数,作为限制方便找到最短路. AC代码:90ms #include<cstdio> #include<cstring> char m ...

  10. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...