首页 > 代码库 > 11.python并发入门(part9 多线程模块multiprocessing基本用法)

11.python并发入门(part9 多线程模块multiprocessing基本用法)

一、回顾多继承的概念。

由于GIL(全局解释器锁)的存在,在python中无法实现真正的多线程(一个进程里的多个线程无法在cpu上并行执行),如果想充分的利用cpu的资源,在python中需要使用进程。


二、multiprocessing模块的简介。

multiprocessing是python中用来管理多进程的包,与threading用法非常类似,它主要使用multiprocessing.Process对象来创建一个进程对象,该进程可以运行在python的函数中。

该Process(进程)对象与Thread(线程)对象的用法基本相同,同样具有start,join,run之类的方法,此外,multiprocessing也具有event,Lock,Semaphore,Condition类,这些对象可以像多线程那样,通过参数传递给各个进程。

其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换成了多进程。


三、多进程的调用方式。

方式1:

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

from multiprocessing import Process

import time

def func1(name):

    print ‘hello %s,%s‘ %(name,time.ctime())

    time.sleep(1)

if __name__ == ‘__main__‘:

    pro_list = []

    for i in range(3):

        p = Process(target=func1,args=str(i))

        pro_list.append(p)

        p.start()

    for i in pro_list:

        i.join()

    print "ending...."


方式2:(通过类的方式来创建多进程。)

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

from multiprocessing import Process

import time

class myprocess(Process):

    def __init__(self):

        super(myprocess, self).__init__()

    def run(self):

        print "hello,%s,%s" %(self.name,time.ctime())

        time.sleep(1)

if __name__ == ‘__main__‘:

    pro_list = []

    for i in range(3):

        p = myprocess()

        p.start()

        pro_list.append(p)

    for p in pro_list:

        p.join()

    print "ending!"



下面还有一个扩展示例,可以瞬间让你明白,父进程与子进程之间的关系。

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

from multiprocessing import Process

import time

import os

def info(title):

    print "title:%s" %(title)

    print "parent process:%s", os.getppid() #获得父进程的进程号也就是ppid

    print "process id: %s", os.getpid() #获得当前进程的pid号

def func1(name):

    info("func1")

    print "hello %s" %(name)

if __name__ == ‘__main__‘:

    info("main process")

    time.sleep(1)

    print "------------------"

    p = Process(target=info,args=(‘su‘,))

    p.start()

    p.join()


输出结果:

title:main process

parent process:%s 40833  #主进程的父进程是pycharm,所以这个是pycharm的进程号

process id: %s 42454  #我们运行的py程序的进程号

------------------

title:su

parent process:%s 42454   #在主进程中又开了个子进程,所以这个子进程的父进程就是我们运行py文件的主进程号

process id: %s 42455  #子进程自己的pid。


三、Process类的常用属性以及方法的介绍。

  1. Process类在实例化对象的时候,都需要哪些参数?

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

    group:这个参数应该是指定一个进程组,这个参数的功能暂时还没有实现,所以必须是None(默认就是None)

    target:这个进程所要执行的函数或者方法。

    name:指定进程名 (也可以用来获取进程名)

    args/kwargs:要传到函数里的参数。


    2.关于进程对象的一些常用方法。

    is_alive(): 返回这个进程是否在运行状态。

    join(timeout):阻塞父进程,一直到这个子进程终止。

    start():开启这个进程,等待cpu调度。

    terminate() 直接对这个进程发起一个SIGTERM信号,立刻终止这个进程。

    

    3.进程类的一些常用属性。

    deamon (注意!这是一个property特殊属性,本质上是个函数)daemon属性用来创建一个守护进程。 (这个守护进程是用于守护父进程的,当父进程退出,这个守护进程也会退出。)

    name  获得进程名。

    pid 获得进程号。



本文出自 “reBiRTH” 博客,请务必保留此出处http://suhaozhi.blog.51cto.com/7272298/1925631

11.python并发入门(part9 多线程模块multiprocessing基本用法)