python 併發程式設計 01多程序

2021-10-02 15:52:44 字數 4340 閱讀 1532

思考:什麼是多程序?

並行:統一時間點同時執行

併發:同一時間間隔裡同時執行

早期單核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

34

事件機制:通過is_set()的bool值,去標識e.wait()的阻塞狀態

匯入 :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...