系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持;

python中的multiprocess为跨平台版本的多进程模块,支持子进程、通信和共享数据、执行不同形式的同步,提供了Process(进程)、Pool(进程池)、Queue(队列)、Pipe(管道)、Lock等组件

1 Process进程

1.1 Process进程基础语法

创建进程的类:

 Process([group [, target [, name [, args [, kwargs]]]]]) 

group:实质上不使用,线程组,目前还没有实现,库引用中提示必须是None

target:调用对象/目标函数

name:给进程赋予一个名字

args:调用对象的位置参数元组 / 按位置给目标函数传参

kwargs:调用对象的字典 / 以字典形式向目标函数传参

实例方法 :

p为进程对象的属性

p.start() 启动某一个进程

p.join([timeout]) 主进程阻塞等待子进程timeout时间后的退出,在时间内若主进程已执行完成,暂时不会退出,而是等待子进程的退出,然后处理子进程后自己再退出

p.is_alive() 进程的状态

p.run() 调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

p.terminate() 不管任务是否完成,立即停止工作进程。

 属性:

p.name 创建的进程的名称

p.authkey

p.exitcode(进程在运行时为None、如果为–N,表示被信号N结束)。

p.pid 创建的子进程PID号

p.daemon 若设置必须置于start调用前进行(和线程的setDeamon功能一样(将父进程设置为守护进程,当父进程结束时,子进程也结束);

默认为false,即主进程执行结束后不退出,等待子进程执行后先退出,然后主进程再退出;

设置为True时,主进程执行后立即退出,并且该主进程的所有子进程也退出

1.2 进程的创建步骤

一般步骤为

(1)确定事件,将事件封装为函数

(2)调用Process类生成响应的子进程对象

(3)调用start()运行子进程

1.3 基本示例

import multiprocessing as mp

def test():
    pass

p = mp.Process(target=test) # 创建子进程
p.start() # 开始执行子进程
p.join() # 等待子进程结束

注意:

1、Process对象可以创建进程,但Process对象本身不是进程。

2、主进程执行完毕后会默认等待子进程结束后回收资源,不需要手动回收资源;join()函数来控制父子进程的结束顺序,待子进程结束后清理子进程所有信息并回收资源。

3、采用Process对象创建进程后,子进程会将主进程的Process对象完全复制一份,这样父子进程各有一个Process对象,p.start()启动子进程,主进程中的Process对象作为静态对象存在,不执行。

4、当子进程执行完毕后,产生的“僵尸进程”会被join()函数回收;或者再有另一条进程开启,start()函数也会回收“僵尸进程”,所以不一定需要写join函数。

5、window系统平台中的子进程结束后会立即自动清除子进程的Process对象,而linux系统平台中的子进程Process对象结束后,如果没有join()函数或start()函数时则会在主进程结束后统一清除。

另外还可以通过继承Process对象来重写run方法创建进程,这里不再赘述。

1.4 示例

1.4.1 Process创建子进程

import multiprocessing as mp
from time import sleep
from random import randint
import os

def test():
    sleep(randint(0,4))
    print(os.getppid(),'-------',os.getpid())
    print("Testing")

for i in range(5):
    p = mp.Process(target=test) #原test()函数已经不是普通的函数,Process对象已经将其转变成进程。
    p.start()

运行

4710 ------- 4711
Testing
4710 ------- 4715
Testing
4710 ------- 4712
Testing
4710 ------- 4713
Testing
4710 ------- 4714
Testing

说明:从运行结果可知,PID=4710的父进程创建了5个子进程(不同的PID对应不同的子进程)。

1.4.2 元组传参

import multiprocessing as mp
from time import sleep

a = 10

def worker(sec):
    print(a)
    sleep(sec)
    print('worker ......')
    print(a)

p = mp .Process(name = 'child', target = worker,args = (5,)) #元组传参

#p进程对象的属性
# p.daemon = True
p.start()  #启动进程
print(p.pid)  #创建的子进程的PID号
print(p.name) #创建的进程的名称
print(p.is_alive()) #进程的状态

a = 100000

p.join() #主进程阻塞等待子进程的退出
print("************main****************")

worker(1)

运行

5399
child
True
10
worker ......
10
************main****************
100000
worker ......
100000

注意:

(1)元组传参args = (5,) 而非args = (5) ,一个元素时需注意。

(2)当创建子进程后,在主进程中重新绑定变量值时,子进程中的变量不会变化。

(3)p.daemon = True / False,

daemon(守护进程)默认是False,即主进程(阻塞)会等待子进程结束;

True则为直接结束主进程,子进程也随之结束,当主进程中加入阻塞函数join时,该句失效。

1.4.3  字典传参

import multiprocessing as mp
from time import sleep
import os

a = 100

def worker(sec,msg):
    print(a)
    sleep(sec)
    print(os.getppid(),'-------',os.getpid())
    print(msg)
    print(a)

for i in range(5):
    p = mp.Process\
    (name = 'Child%d'%i,target=worker,
 #       args = (2,"child process"),\
        kwargs={'sec':2,'msg':"child process"})
    p.start()

sleep(1)
a = 100000

p.join()

运行

100
100
100
100
100
5590 ------- 5592
child process
100
5590 ------- 5591
child process
100
5590 ------- 5593
child process
100
5590 ------- 5594
child process
100
5590 ------- 5595
child process
100

说明:

(1)这里面中的字典传参与元组传参的可以相互替代,但元素传参需注意位置关系

(2)开始时输出连续打印出100是由于子进程中sleep()所致,当去掉时,连续执行数次(>3)时100均非连续;同时子进程PID号也是乱序(此也说明子进程相互独立)。

1.4.4  在window平台系统

from multiprocessing import Process  #导入Process模块
import os

def test(name):
    '''
    :param :
    :return:
    下段代码适用于Linux中运行,因windows下os模块不支持getppid()
    '''
    print("Process ID: %s" % (os.getpid()))
    print("Parent Process ID: %s" % (os.getppid()))

# windows下,创建进程的代码一下要放在main函数里面
if __name__ == "__main__":
    proc = Process(target=test, args=('nmask',))
    proc.start()
    proc.join()

该段代码没有在window下尝试运行,在Linux虚拟机上运行正常;相信但要有所怀疑!

详细参看

multiprocessing解析(一):Process的解析

python的multiprocessing模块进程创建、资源回收-Process,Pool

Python多进程编程

python学习笔记——multiprocessing 多进程模块Process的更多相关文章

  1. python学习笔记——multiprocessing 多进程组件-队列Queue

    1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...

  2. python学习笔记——multiprocessing 多进程组件 Pipe管道

    进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...

  3. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  4. python学习笔记——multiprocessing 多进程中的重构方法__init__

    重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...

  5. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  6. Python 学习笔记(6)--常用模块(2)

    一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.p ...

  7. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  8. Python学习笔记十_模块、第三方模块安装、模块导入

    一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...

  9. Python学习笔记:bisect模块实现二分搜索

    在Python中可以利用bisect模块来实现二分搜索,该模块包含函数只有几个: import bisect L = [1,3,4,5,5,5,8,10] x = 5 bisect.bisect_le ...

随机推荐

  1. 【转载】如果快速开发APP&创业

    先贴原文所在个人博客: http://uikoo9.com/ 今天看了一些这个人的文章,还是有一定见解的,比如下面这篇 <如何快速开发出一个高质量的APP——创业谈> http://uik ...

  2. jQuery中开发插件的两种方式(附Demo)

    做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数是属于jQuery命名空间的函数),如果将jQu ...

  3. TextBox_TextChanged

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { TextBox textBox = sender a ...

  4. java 判断字符串是否相等 (转)

    http://blog.csdn.net/chtnj/article/details/7909720 判断字符串相等我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题 ...

  5. Java的泛型中,通配符可以设置上限和下限

    上限:<? extends T> ?是T和T的子类 下限:<? super T> ?是T和T的父类 怎么看待这个上限和下限呢 首先应该想 其实对于Java来说 <? ex ...

  6. jmeter-The JVM should have exitted but did not

    修改 jmeterengine.force.system.exit=true

  7. 【Nodejs】理想论坛帖子下载爬虫1.04

    一直想做一个能把理想论坛指定页范围的帖子都能完整下载下来的爬虫,但未能如愿. 主要的障碍在并发数的控制和长时间任务的突然退出,比如想下载前五页的帖子,分析后可得到大约15000个主贴或子贴,如果用回调 ...

  8. C# Lambda表达式 基础

    什么是Lambda 表达式? "Lambda表达式"实际上是一个方法,只不过该方法是一个匿名方法(就是没有名字的方法(函数),就是说只有在定义的时候能调用,在其他地方就不能调用了) ...

  9. ASP.NET伪静态

    http://www.duote.com/tech/5/14543.html 三.伪静态的坏处 当然犹如一篇文章的作者所说的:"如果流量稍大一些使用伪静态就出现CPU使用超负荷,我的同时在线 ...

  10. ORA-01109:数据库未打开(解决)

    SQL> startup mountORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它SQL> shutdown immediateORA-01109: 数据库未打开 ...