Python多進程(二)——創建多線程 & 繼承process類 & 進程池

Process實例有2個重要屬性:name和pid

Process實例的方法

 

#導入模塊
import multiprocessing
import time

#定義進程執行函數
def clock(interval):
	for i in range(5):
		print('當前時間爲{0}: '.format(time.ctime()))
		time.sleep(interval)

if __name__=='__main__':
	#創建子進程
	p=multiprocessing.Process(target=clock,args=(1,))
	#啓動子進程
	p.start()
	p.join()
	#獲取進程的 ID
	print('p.id:',p.pid)
	#獲取進程的名稱
	print('p.name:',p.name)
	#判斷進程是否運行
	print('p.is_alive:',p.is_alive())

 

創建多個進程

執行不同的任務

#導入模塊
import multiprocessing
import time

#創建進程調用函數
def work1(interval):
	print('執行work1')
	time.sleep(interval)
	print('end work1')

def work2(interval):
	print('執行work2')
	time.sleep(interval)
	print('end work2')

def work3(interval):
	print('執行work3')
	time.sleep(interval)
	print('end work3')

if __name__=='__main__':
	print('執行主進程')
	#創建進程對象
	p1=multiprocessing.Process(target=work1,args=(4,))
	p2=multiprocessing.Process(target=work2,args=(3,))
	p3=multiprocessing.Process(target=work3,args=(2,))
	#啓動進程
	p1.start()
	p2.start()
	p3.start()
	p1.join()
	p2.join()
	p3.join()
	print('主進程結束')

 

繼承process類創建進程

      像Java一樣,也有2種方式創建進程

      創建進程的方式還可以使用類的方式,可以自定義一個類,繼承 Process 類,重寫run方法,每次實例化這個類的時候,就等同於實例化一個進程對象
 

#導入模塊
from multiprocessing import Process
import time

#定義線程類
class ClockProcess(Process):
	def __init__(self,interval):
		Process.__init__(self)
		self.interval=interval
	def run(self):
		print('子進程開始執行的時間:{}'.format(time.ctime()))
		time.sleep(self.interval)
		print('子進程結束的時間:{}'.format(time.ctime()))

if __name__=='__main__':
	#創建子進程
	p=ClockProcess(2)
	#調用子進程
	p.start()
	p.join()
	print('主進程結束')

 

進程池

      在利用 Python 進行系統管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,並行操作可以節約大量的時間。當被操作對象數目不大時,可以直接利用multiprocessing 中的 Process 動態成生多個進程,十幾個還好,但如果是上百個,上千個目標,手動的去限制進程數量卻又太過繁瑣,此時可以發揮進程池的功效。

      Pool 可以提供指定數量的進程,供用戶調用,當有新的請求提交到 pool 中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,纔會創建新的進程

Pool(numprocess, initializer, initargs)

      其中 numprocess 是要創建的進程數。如果省略此參數,將使用 cpu_count()的值。cpu是4核,就創建有4個進程的進程池,8核就創建8個進程的進程池

      Initializer是每個工作進程啓動時要執行的可調用對象。 Initargs 是要傳遞給 initializer 的參數元祖。

      Initializer 默認爲 None

 

import multiprocessing
import time

def func(msg):
	print("start:", msg)
	time.sleep(3)
	print("end: ",msg)

if __name__ == "__main__":
	pool = multiprocessing.Pool(processes = 3)
	for i in range(5):
		msg = "任務%d" %(i)
		#維持執行的進程總數爲 processes,當一個進程執行完畢後會添加新的進程進去
		pool.apply_async(func, (msg, ))
	pool.close()#進程池關閉之後不再接收新的請求
	#調用 join 之前,先調用 close 函數,否則會出錯。
	# 執行完 close 後不會有新的進程加入到 pool,join 函數等待所有子進程結束
	pool.join()

apply_async 是在一個池工作進程中異步地執行函數(*args, **kwargs),然後返回結果

apply是在一個池工作進程中執行函數(*args, **kwargs),然後返回結果。
 

這是使用apply執行線程池的線程的

import multiprocessing
import time

def func(msg):
	print("start:", msg)
	time.sleep(3)
	print("end",msg)

if __name__ == "__main__":
	pool = multiprocessing.Pool(processes = 3)
	for i in range(5):
		msg = "任務%d" %(i)
		#維持執行的進程總數爲 processes,當一個進程執行完畢後會添加新的進程進去
		pool.apply(func, (msg, ))
	pool.close()
	#調用 join 之前,先調用 close 函數,否則會出錯。
	# 執行完 close 後不會有新的進程加入到 pool,join 函數等待所有子進程結束
	pool.join()

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章