1. 程式人生 > >11.python並發入門(part9 多線程模塊multiprocessing基本用法)

11.python並發入門(part9 多線程模塊multiprocessing基本用法)

python 多進程 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基本用法)