上一篇文章我們學習了在不同操作系統上實現多進程的操作,今天我們繼續學習多進程
在windows操作系統中我們一次性要開放多個進程我們可以引入進程池的概念倆批量創建子進程
from multiprocessing import Pool #先引入進程池函數
import os, time, random #需要os系統模塊time計時模塊random隨機數模塊
def long_time_task(name): #定義一個承載函數
print('Run task %s (%s)...' % (name, os.getpid())) #os.getpid()打印出當前承載的進程
start = time.time() #獲取當前的時間戳time.time()
time.sleep(random.random() * 3) #獲取一個隨機數random.random()並將這個隨機數作為等待時間 time.sleep線程推遲指定的時間運行。單位為秒
end = time.time() #獲取結束此進程的時間戳
print('Task %s runs %0.2f seconds.' % (name, (end - start))) #打印出進程的生存週期
if __name__=='__main__': #自調用可應用
print('Parent process %s.' % os.getpid()) #打印父進程
p = Pool(4) #創建一個四個進程的進程池
for i in range(5): #建立一個循環
p.apply_async(long_time_task, args=(i,)) #主進程循環運行過程中不等待apply_async的返回結果,在主進程結束後,即使子進程還未返回整個程序也會退出。雖然 apply_async是非阻塞的,但其返回結果的get方法卻是阻塞的,如使用result.get()會阻塞主進程。
print('Waiting for all subprocesses done...') #所有子循環結束後打印這句話
p.close()
p.join() #結束所有進程
print('All subprocesses done.')
運行結果如上圖。
子進程:
很多時候,子進程並不是自身,而是一個外部進程。我們創建了子進程後,還需要控制子進程的輸入和輸出。
subprocess模塊可以讓我們非常方便地啟動一個子進程,然後控制其輸入和輸出。
import subprocess #引入subprocess模塊
print('$ nslookup www.python.org') #打印
r = subprocess.call(['nslookup', 'www.python.org']) #打開一個子進程用call方法使用nslookup來打開網站信息
print('Exit code:', r) #打印註銷子進程信息
進程間的通訊主要通過Queue函數
from multiprocessing import Process, Queue #Process, Queue兩個函數
import os, time, random #同樣需要os,time,random三個模塊
# 寫數據進程執行的代碼:
def write(q):
print('Process to write: %s' % os.getpid())
for value in ['A', 'B', 'C']:
print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())
# 讀數據進程執行的代碼:
def read(q):
print('Process to read: %s' % os.getpid())
while True:
value = q.get(True)
print('Get %s from queue.' % value)
if __name__=='__main__':
# 父進程創建Queue,並傳給各個子進程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 啟動子進程pw,寫入:
pw.start()
# 啟動子進程pr,讀取:
pr.start()
# 等待pw結束:
pw.join()
# pr進程裡是死循環,無法等待其結束,只能強行終止:
pr.terminate()
運行結果如上圖。
進程目前就是這些,下節我們來聊下線程