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類的常用屬性以及方法的介紹。
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基本用法)