多进程

Posted jsnhdream

tags:

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

多进程

  同一时刻并行的处理多个任务,即为多进程。比如,你一边喝茶、看书还听着音乐。真正的并行多任务只能在多核的CPU上实现,由于任务数量是远远多于CPU的核数,所以操作系统会自动将多任务短时间轮流切换执行,给我们的感觉就像同时在执行一样。

  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。编写的代码没有运行叫程序,正在运行的代码就是进程。

fork

  Python中可以使用os模块fork()函数来创建子进程。程序执行os.fork()时,操作系统会创建一个子进程,然后复制父进程的所有信息到子进程中;调用一次os.fork()时,会返回两次值。返回给子进程的值一定是0,返回给父进程的是子进程中的pid号。返回给父进程pid(子进程的)号,是因为父进程可以fork出多个子进程,所以有必要记住子进程的pid号。

import os

print("当前进程pid= %d"% os.getpid())
num = 0
pid = os.fork()
if pid == 0:
    print("我是子进程: %s,父进程是:%s"%(os.getpid(),os.getppid()))
    num += 1
    print("num = %d"%num)
else:
    print("我是父进程:%s,我的子进程是:%s"%(os.getpid(),pid))
    num += 1
    print("num = %d"%num)

print("父、子进程都可以执行")

输出:
当前进程pid= 4262
我是父进程:4262,我的子进程是:4263
num = 1
父、子进程都可以执行
我是子进程: 4263,父进程是:4262
num = 1
父、子进程都可以执行

多进程中,每个进程都各自拥有一份,互不影响,如上num = 1。

multiprocessing

  由于fork函数存在于Linux、Unix、Mac操作系统中,Windows操作系统无fork函数调用,Python作为一个跨平台的语言,使用multiprocessing模块封装fork函数来创建多进程。multiprocessing提供一个Process类来代表一个进程对象。

Process使用:

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


    target:表示这个进程实例所调用对象;

    args:表示调用对象的位置参数元组;

    kwargs:表示调用对象的关键字参数字典;

    name:为当前进程实例的别名;

    group:大多数情况下用不到;

Process类常用方法:

    is_alive():判断进程实例是否还在执行;

    join([timeout]):是否等待进程实例执行结束,或等待多少秒;

    start():启动进程实例(创建子进程);

    run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;

    terminate():不管任务是否完成,立即终止;

Process类常用属性:

    name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;

    pid:当前进程实例的PID值;

from multiprocessing import Process
import os
import time

def run_proc(name,age,**kwargs):
    for i in range(10):
        print(子进程运行中,name= %s,age=%d,pid=%d%(name,age,os.getpid()))
        print(kwargs)
        time.sleep(1)

if __name__ == __main__:
    print(父进程 %d%os.getpid())
    p = Process(target=run_proc,args=(MI,18),kwargs={S:99})
    print(将要执行子进程)
    p.start()
    time.sleep(2)
    p.terminate()
    p.join()
    print(子进程结束了)

输出:
父进程 4460
将要执行子进程
子进程运行中,name= MI,age=18,pid=4461
{S: 99}
子进程运行中,name= MI,age=18,pid=4461
{S: 99}
子进程结束了

 




























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

线程学习知识点总结

多线程编程

多线程编程

多个请求是多线程吗

python多线程

python中的多线程和多进程编程