思考:什麼是多程序?
並行:統一時間點同時執行
併發:同一時間間隔裡同時執行
早期單核cpu的時候沒有並行的概念,只有併發的概念。多程序模組:
一 利用multiprocessing包的process類開啟多程序程式示例如下:
from multiprocessing import process
import time
import os
def func(i):
time.sleep(1) # 延時1s
# os.getpid()獲取當前程序自己的pid
# os.getppid()獲取當前程序父程序的pid
print("這是子程序{},pid是:{};我的父程序pid是:{}"
.format(i, os.getpid(), os.getppid()))
if __name__ == '__main__':
# 同乙個程序的pid相同
print("這是父程序1,pid是:%s" % (os.getpid()))
for i in range(3):
p = process(target=func, args=(i,)) #例項化乙個程序物件
# args是元組資料型別
p.start() # 開啟乙個子程序
print("這是父程序2,pid是:%s" % (os.getpid()))
執行結果:這是父程序1,pid是:28716
這是父程序2,pid是:28716
這是子程序0,pid是:16896;我的父程序pid是:28716
這是子程序1,pid是:13308;我的父程序pid是:28716
這是子程序2,pid是:12572;我的父程序pid是:28716
二 利用繼承的process類開啟多程序程式示例如下:
# 以繼承的方式開啟子程序
from multiprocessing import process
import os
class my_process(process):
def __init__(self, name):
super(my_process, self).__init__()
self.name = name
def run(self):
print("這是以繼承方式開啟的子程序,接收到名字%s,程序pid為:%s" %(self.name, os.getppid()))
if __name__ == '__main__':
p = my_process('alex')
p.start() #會自動調取類中的run方法 相當於程序"就緒",底層呼叫的就是run()
p.run() #調取類中的run方法 相當於程序"執行"
執行結果:這是以繼承方式開啟的子程序,接收到名字alex,程序pid為:4620
這是以繼承方式開啟的子程序,接收到名字alex,程序pid為:22132
p.start():啟動程序,並呼叫該子程序中的p.run()
p.terminate():強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,使用該方法需要特別小心這種情況。如果p還儲存了乙個鎖那麼也將不會被釋放,進而導致死鎖
p.is_alive():如果p仍然執行,返回true
join() 主程序阻塞住等待子程序執行.可以讓子程序和付程序處於同步狀態. join必須放在start()後面
p.join只能join住start開啟的程序,而不能join住run開啟的程序
1 p.daemon:預設值為false,如果設為true,代表p為後台執行的守護程序,當p的父程序終止時,p也隨之終止,並且設定為true後,p不能建立自己的新程序,必須在p.start()之前設定
2 p.name:程序的名稱
3 p.pid:程序的pid
4 p.exitcode:程序在執行時為none、如果為–n,表示被訊號n結束(了解即可)
5 p.authkey:程序的身份驗證鍵,預設是由os.urandom()隨機生成的32字元的字串。這個鍵的用途是為涉及網路連線的底層程序間通訊提供安全性,這類連線只有在具有相同的身份驗證鍵時才能成功(了解即可)
常用方法和屬性程式示例:
from multiprocessing import process
import os
import time
def func():
print("執行子程序,子程序pid是%s" % os.getpid())
if __name__ == '__main__':
p = process(target=func)
p.daemon = true # 守護程序必須在p.start之前執行
p.start()
print('子程序pid是%s' % p.pid)
print('子程序的名稱:%s' % p.name)
print('子程序是否為為守護程序在後台執行:%s' % p.daemon) # p程序是否為後台守護程序
# 守護程序:跟隨著父程序的**結束,子程序就結束
# 守護程序不允許開啟子程序
print('執行父程序,父程序pid是%s' % os.getpid())
執行結果:示例:子程序pid是18512
子程序的名稱:process-1
子程序是否為為守護程序在後台執行:true
執行父程序,父程序pid是25456
from multiprocessing import process
def func(i):
print(i)
# global n
# print(n) #執行時無法獲取n=100因為多程序無法共享記憶體
if __name__ == '__main__':
# n = 100
for i in range(10):
p = process(target= func, args=(i,))
p.start()
p.join() #沒有加join父程序先於子程序執行,且子程序的執行順序不定
print("這是父程序!!!")
鎖機制:一把鎖配一把鑰匙
匯入 :from multiprocessing import lock
例項化:l = lock()
拿鑰匙,鎖門:l.acquire()
換鑰匙,開門:l.release()
訊號機制:初始化一把鎖配n把鑰匙,當鑰匙使用完程式會被阻塞。
匯入 :from multiprocessing import semaphore
例項化:sem = semaphore(n) n是int型,代表對應幾把鑰匙
拿鑰匙,鎖門:sem.acquire()
還鑰匙,開門:sem.release()
semaphore訊號機制示例:
# 訊號量可以實現一把鎖配多把鑰匙使用s
from multiprocessing import semaphore
l = semaphore(3) # 例項化乙個訊號量,配3把鑰匙
l.acquire() # 拿走一把鑰匙鎖上門
print(1)
l.acquire() # 拿走一把鑰匙鎖上門
print(2)
l.acquire() # 拿走一把鑰匙鎖上門
print(3)
l.release() # 釋放一把鑰匙,如果沒有釋放無法輸出print(4)
l.acquire() # 拿走一把鑰匙鎖上門
print(4)
執行結果:12事件機制:通過is_set()的bool值,去標識e.wait()的阻塞狀態34
匯入 :from multiprocessing import event
例項化:e = event()
python併發程式設計 多程序
import os import time from multiprocessing import process def func args,args2 print args,args2 time.sleep 3 print 子程序 os.getpid print 子程序的父程序 os.getpp...
python多程序併發
由於python下呼叫linux的shell命令都需要等待返回,所以常常我們設定的多執行緒都達不到效果,因此在呼叫shell命令不需要返回時,使用threading模組並不是最好的方法。python提供了非常好用的多程序包multiprocessing,你只需要定義乙個函式,python會替你完成其...
python併發程式設計之多程序
今天學習了python併發程式設計之多程序 一 multiprocessing模組介紹 python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源 os.cpu count 檢視 在python中大部分情況需要使用多程序。python提供了multiprocessing。multi...