码迷,mamicode.com
首页 > 系统相关 > 详细

多进程

时间:2018-12-05 01:58:27      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:字典   %s   时间   分配   参数   切换   平台   启动进程   rgs   

多进程

  同一时刻并行的处理多个任务,即为多进程。比如,你一边喝茶、看书还听着音乐。真正的并行多任务只能在多核的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}
子进程结束了

 

多进程

标签:字典   %s   时间   分配   参数   切换   平台   启动进程   rgs   

原文地址:https://www.cnblogs.com/jsnhdream/p/10068495.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!