python3高级编程一文搞懂多进程

Posted 南城以南1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3高级编程一文搞懂多进程相关的知识,希望对你有一定的参考价值。

1 Linux平台下的多进程


1.1进程:

指正在执行的程序,是程序正在运行的一个实例,由程序指令和从文件、其他程序中读取的数据或者系统用户的输入组成。

 1.2线程和进程的关系:


 1.对操作系统来说,一个任务就是一个进程,
 2.在一个进程内部,要同时做很多件,就需要同时运行多个“子任务”,把进程内部的这些子任务成为线程
 3.线程是最小的执行单元,一个线程只能属于一个进程,而一个进程可以由很多线程,但是进程至少有一个线程组成,这个线程成为主线程

os.getpid()函数:获取Python程序占有的进程号
os.fork()函数:调用一次返回两次,在Linux使用

> 1.os.fork()函数一旦运行就会产生一个新的子进程,
> 2.os.fork()只能在Linux下运行

pid = os.fork()
if pid == 0:
    print("子进程(pid = 0),父进程(id = 1)".foemat(os.getpid(),os.getppis()))
else:
    print("父进程(pid = 0),子进程(cpid)".format(os.getpid(),pid))

2.跨平台的多进程


1.multiprocessing模块

1.multiprocessing模块提供Process类来代表一个进程对象,每实例化一个Process类就创建一个进程对象

from multiprocessing import Process
printcess(group=None,target=None,name=None,args=(),kwargs=,*,daemon=None)
参数说明:
taget:是函数名称,需要调用的函数
args:函数需要的参数,以元组的形式传入
主要方法:
start():启动进程
join():实现进程间的同步,等待所有进程退出
run():如果没有给定target参数,这个对象调用start()方法时,就执行对象中的run()方法
terminate():不管任务时候完成,立即终止进程


2.Python3中创建进程的两种方式


1)函数是创建进程
创建子进程的时候只需要创建一个执行函数和函数的参数鸡哥完成Process实例的创建。

import os
import time
from multiprocessing import Process


def osgetpid():
    pass


def handle(name, num):
    for i in range(num):
        print('子进程运行中,name=0,i=1,pid=2,ppid=3'.format(name, i, osgetpid(), os.getppid()))


if __name__ == '__main__':
    print('父进程%d' % os.getpid())
    p1 = Process(target=handle, args=('python3', 2))
    p2 = Process(target=handle, args=('java', 3))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print('子进程结束')
    time.sleep(10)
    print('父进程结束')

输出结果
父进程18464
子进程运行中,name=python3,i=0,pid=None,ppid=18464
子进程运行中,name=java,i=0,pid=None,ppid=18464
子进程运行中,name=python3,i=1,pid=None,ppid=18464
子进程运行中,name=java,i=1,pid=None,ppid=18464
子进程运行中,name=java,i=2,pid=None,ppid=18464
子进程结束
父进程结束        


2)创建进程类,创建multiprocessing.Process的子类,来包装一个进程对象,通过继承Process类,并且重写Process类的run方法,在run()方法中定义具体要执行的任务。

3.子进程


subprocess模块:启动一个子进程,然后控制输入和输出

import subprocess

result = subprocess.call(['ping', '172.0.0.1'])
print(result)

3.进程池(pool)


批量创建进程时,使用multiprocessing模块的Pool类

pool类可以提供一个指定数量的进程提供给用户调用,如果池子没满,就创建一个新的进程来执行改请求,如果池满了,等到池子中有进程结束,才会创建新的进程来执行请求

multiprocessing.Pool类的主要用法
1.apply_async(func,args,kwds) 
func:使用非阻塞的方式调用func函数,并执行,args为传递给func的参数列表
2.apply(func,args,kwds),使用阻塞方式调用func函数,阻塞方式必须等待上一个进程结束才能执行下一个进程3
3.join().主进程阻塞
4.close().关闭进程池,
5.terminate()不管任务是否完成,立刻终止进程池子

3 跨平台间的多进程通信


Queue类:用来进行多个进程间的通信

1.单进程通信:在单进程中使用multiprocessing模块的Queue类模拟队列储存和读取数据

2.跨平台的多进程通信:在多进程开发中,生产者就是生产数据的进程,消费者就是消费数据的进程,


4 分布式进程


分布式进程中,使用Python3的Queue生成发送任务的对象和接受任务的队列,在服务器端需要用multiprocessing.managers模块把Queue类的对象通过网络暴露出去,就可以让其他机器访问Queue

 

 1.分布式进程包括服务进程(master)和任务进程(woker),分布式进程运行是需要关闭服务器进程和任务进程所在机器上的防火墙服务
 2.服务器进程和任务进程运行在两台服务器时,两台机器代码的ip需要改成服务进程(master)的ip

以上是关于python3高级编程一文搞懂多进程的主要内容,如果未能解决你的问题,请参考以下文章

一文读懂多线程

彻底搞懂多线程中各个难点

彻底搞懂多线程中各个难点

「Linux」多线程详解,一篇文章彻底搞懂多线程中各个难点

一文搞懂linux进程

一文搞懂进程线程协程