python 多进程

一.多进程

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就不必我多讲了吧,所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。 

它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。

多进程和多线程的区别:

多线程使用的是cpu的一个核,适合io密集型
多进程使用的是cpu的多个核,适合运算密集型

组件:

Python提供了非常好用的多进程包,multiprocessing,我们在使用的时候,只需要导入该模块就可以了。

Multiprocessing支持子进程,通信,共享数据,执行不同形式的同步,提供了Process,Pipe, Lock等组件。

二.使用

1.建一个Process对象
p = multiprocessing.Process(target=worker_1, args=(2, ))

target = 函数名字
args  =  函数需要的参数,以tuple的形式传入
注意: 单个元素的tuple的表现形式

multprocessing用到的两个方法
cpu_count() 统计cpu总数
active_children() 获得所有子进程

 Process的对象常用方法
is_alive()            判断进程是否存活
run() 启动进程
start() 启动进程,会自动调用run方法,这个常用
join(timeout) 等待进程结束或者直到超时

Process的常用属性
name 进程名字
pid 进程的pid
2.启动一个子进程并等待其结束

#导入模块import multiprocessing

# 子进程要执行的代码
def run_proc(name):
    print('Run child process {0}'.format(name))


def main():
    print("start main")    #开始
    p1 = multiprocessing.Process(target=run_proc, args=("test1",))
    p2 = multiprocessing.Process(target=run_proc, args=("test2",))
    p1.start()            #启动p1子进程
    p2.start()            #启动p2子进程
    for p in multiprocessing.active_children():   #使用active_children()方法获取所有子进程
        print(p.name,p.pid)                        #打印所有子进程的name,pid
    p1.join()                                    #join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
    p2.join()

    print("end main")        #结束


if __name__=='__main__':
    main()

运行结果为:

start main
Process-1 11424
Process-2 5548
Run child process test1
Run child process test2
end main

3.Lock组件
当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,如果两个文件同时进行,肯定是不行的,必须是文件写结束以后,才可以进行读操作。或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就要有一个锁机制进行控制。

需求:
一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来
我们可以通过进程的join()方法来实现,但是为了学习Lock,用Lock来实现。

先看不加锁程序,在看加锁程序,最后比较两个程序的区别

(1)不加锁程序

#导入模块
import multiprocessing
import time

#创建每次加1的函数
def add1(value, number):
        print("start add1 number= {0}".format(number))
        for i in range(1, 5):
            number += value
            time.sleep(0.3)
            print("number = {0}".format(number))

#创建每次加3的函数
def add3(value, number):
    print("start add3 number= {0}".format(number))
    try:
        for i in range(1, 5):
            number += value
            time.sleep(0.3)
            print("number = {0}".format(number))
    except Exception as e:
        raise e
    finally:
        pass


if __name__ == '__main__':
    print("start main")
    number = 0
    p1 = multiprocessing.Process(target=add1, args=( 1, number))
    p3 = multiprocessing.Process(target=add3, args=( 3, number))
    p1.start()
    p3.start()
    print("end main")

结果为:

start main
end main
start add1 number= 0
start add3 number= 0
number = 1
number = 3
number = 2
number = 6
number = 3
number = 9
number = 4
number = 12

(2)加锁程序

import multiprocessing
import time


def add1(lock, value, number):
    with lock:
        print("start add1 number= {0}".format(number))
        for i in range(1, 5):
            number += value
            time.sleep(0.3)
            print("number = {0}".format(number))


def add3(lock, value, number):
    lock.acquire()
    print("start add3 number= {0}".format(number))
    try:
        for i in range(1, 5):
            number += value
            time.sleep(0.3)
            print("number = {0}".format(number))
    except Exception as e:
        raise e
    finally:
        lock.release()
        pass


if __name__ == '__main__':
    print("start main")
    number = 0
    lock = multiprocessing.Lock()
    p1 = multiprocessing.Process(target=add1, args=(lock, 1, number))
    p3 = multiprocessing.Process(target=add3, args=(lock, 3, number))
    p1.start()
    p3.start()
    print("end main")
运行结果为:
start main
end main
start add1 number= 0
number = 1
number = 2
number = 3
number = 4
start add3 number= 0
number = 3
number = 6
number = 9
number = 12

4.共享内存
python的multiprocessing模块也给我们提供了共享内存的操作。
一般的变量在进程之间是没法进行通讯的,multiprocessing给我们提供了Value和Array模块,他们可以在不通的进程中共同使用。

实例

import multiprocessing
from multiprocessing import Value, Array, Manager


def add1(value, number):
    print("start add1 number= {0}".format(number.value))
    for i in range(1, 5):
        number.value += value
        print("number = {0}".format(number.value))


def add3(value, number):
    print("start add3 number= {0}".format(number.value))
    try:
        for i in range(1, 5):
            number.value += value
            print("number = {0}".format(number.value))
    except Exception as e:
        raise e


if __name__ == '__main__':
    print("start main")
    number = Value('d', 0)    #设置共享内存
    p1 = multiprocessing.Process(target=add1, args=(1, number))
    p3 = multiprocessing.Process(target=add3, args=(3, number))
    p1.start()
    p3.start()
    print("end main")

运行结果为:

start main
end main
start add1 number= 0.0
number = 1.0
number = 2.0
number = 3.0
number = 4.0
start add3 number= 4.0
number = 7.0
number = 10.0
number = 13.0
number = 16.0
两个进程add1,add3他们都在同一个number上进行了操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值