併發編程5 操做系統&進程

一.今日大綱windows

1.multiprocessing模塊簡單應用併發

2.for循環建立進程異步

3.進程傳參方式和建立方式2spa

4.join方法操作系統

5.操做系統基礎code

二.今日內容對象

    (1)操做系統簡單介紹
多道技術:(超級重點)
空間複用
時間複用
進程之間是空間隔離的
分時系統
實時系統
通用操做系統(遇到io切換的會提升代碼效率),

併發:又稱僞併發,看着像同時運行,實際上是任務之間的切換(遇到IO切換的會提升代碼效率)
任務切換+保存狀態(保存現場)
並行:真正的同時在運行,應用的是多核技術(多個cpu)

進程三狀態:就緒(等待操做系統調度去cpu裏面執行) 執行 阻塞

提交任務的方式:同步異步
任務的執行狀態:阻塞非阻塞
異步:任務的提交方式,多個任務提交出去,同時執行

同步堵塞:
異步堵塞:

同步非堵塞:
異步非堵塞:

(這裏是開啓進程)

(2)進程的兩種建立方式
Process(target=f1,args=(i,)) kwargs={'形參名爲key':值}

(3)
#例子
from multiprocessing import Process

class MyProcess(Process): #繼承
def __init(self,n):
super().__init__()
self.n=n

def run(self):
pass
if __name__='__main__':
P=MyProcess(12)
P.start()

join方法:主進程等待子進程執行結束再繼續執行
沒有join的話,先執行主進程中的內容
for 循環開啓進程
三.詳細內容
(1)multiprocessing模塊簡單應用:
#運行中的程序叫作進程
import time
time.sleep(1)
print('123')
#操做系統是大型軟件
#操做系統幫助咱們調用硬件的

重點代碼&重點註釋分析
進程的建立方式1
import time
from multiprocessing import Process
def f1():
    time.sleep(3)
    print('xxx')
def f2():
    time.sleep(3)
    print('sss')
#f1()
#f2()
#重點理解:windows系統下必須寫main,由於windows系統建立子進程的方式決定的,開啓一個子進程,
# 這個子進程會copy一份主進程的全部代碼,而且機制相似於import引入,這樣就容易致使引入代碼的時候,
# 被引入的代碼中的可執行程序被執行,致使遞歸開始進程,會報錯
if __name__=='__main__':
    p1=Process(target=f1,)  #子進程至關於copy主進程的內容一份
    p2=Process(target=f2,)
    p1.start()              #先調用主程序內的,再執行本身的而且,
                            # 全部start必須執行完,才能夠執行,
    p2.start()

    time.sleep(3)  #僅限於咱們的程序
    # p1.join()   #意思是子進程執行完才執行主進程
    # p2.join()
    print('我是主進程!!')

'''
不註釋
p1.join()
p2.join():
結果:
xxx
sss
我是主進程!!

註釋
p1.join()
p2.join():
結果:
我是主進程!!
xxx
sss
'''

(2)for循環建立進程blog

import time
from multiprocessing import Process

def f1(i):
    time.sleep(1)
    print(i)

if __name__=='__main__':

    for i  in  range(20):
        p1=Process(target=f1,args=(i,))  #傳參
        p1.start()

注意:上邊獲得的結果是:0-19的20行數字,而且不是按照有序排列的繼承

(3)演示兩種傳參方式遞歸

演示兩種傳參方式
方式一:
# import time
# from multiprocessing import Process
# def f1(i):
#     time.sleep(3)
#     print(i)
# if __name__=='__main__':
#         p1=Process(target=f1,args=('冬瓜與黃瓜',))  #傳參
#         p1.start()  #給操做系統發送一個建立進程的信號,後續進程的建立都是操做系統的事

方式二
# import time
# from multiprocessing import Process
#
# def f1(i):
#     time.sleep(3)
#     print(i)
# if __name__=='__main__':
#     p1=Process(target=f1,kwargs={'i':'大牛'})  #傳參//建立進程對象
#     p1.start()  #給操做系統發送一個建立進程的信號,後續進程的建立都是操做系統的事

案例:

from multiprocessing import  Process
class MyProcess(Process):
    def run(self):
        print('寶寶')
if __name__=='__main__':
    p1=MyProcess()
    p1.start()

(4)進程的建立方式2

#傳參:須要從新寫一個init方法
from multiprocessing import Process
class MyProcess(Process):
    def __init__(self,n):
        super().__init__()  #先執行父類的方法
                            #別忘了執行父類的init
        ''''''
        '''
        沒有上面的一句話,會報錯,緣由是下面,因此必須繼承父類的參數
        assert self._popen is None, 'cannot start a process twice'
        AttributeError: 'MyProcess' object has no attribute '_popen'
        '''
        self.n=n        #本身定義的形式參數n

    def run(self):
        print('寶寶and%s不可告人的事情'%self.n)
if __name__=='__main__':
    p1=MyProcess('搞忘')
    p1.start()

(5)join方法

import time
from multiprocessing import Process
def f1():
    time.sleep(2)
    print('xxxx')
def f2():
    time.sleep(2)
    print('ssss')
# f1()
# f2()
if __name__ == '__main__':

    p1 = Process(target=f1,)
    p1.start()
    p1.join()  # 主進程等待子進程運行完才繼續執行

    print('開始p2拉')      #這個地方至關於主進程

    p2 = Process(target=f2,)
    p2.start()
    p2.join()
    print('我要等了...等個人子進程...')
    time.sleep(3)
    print('我是主進程!!!')

'''
若是把兩個join()方法註釋掉,結果是:
開始p2拉 我要等了...等個人子進程... xxxx ssss 我是主進程!!!

不註釋的結果是:
xxxx 開始p2拉 ssss 我要等了...等個人子進程... 我是主進程!!!
相關文章
相關標籤/搜索