1. 程式人生 > >python基礎程序和子執行緒

python基礎程序和子執行緒

單核cpu實現多工的原理
在這裡插入圖片描述
多核cpu實現多工的原理
在這裡插入圖片描述
以上圖片來自千峰教育,如有侵權聯絡刪除
‘’’
什麼叫多工:作業系統可以同時執行多個任務,現代的作業系統比如windows、mac os、liunx、unix等都是支援多工的系統
‘’’
‘’'實現多工的方式
1、多程序模式:啟動多個程序,每個程序雖然只有一個執行緒,但是多個程序可以一起執行多個任務

2、多執行緒模式:啟動一個程序,在一個程序的內部啟動多個執行緒,這樣多個執行緒也可以一起執行多個任務
3、多程序+多執行緒:啟動多個程序,每個程序再啟動多個執行緒
4、協程
5、多程序+協程

‘’’
父子程序的先後執行順序

from  multiprocessing import Process
from  time import sleep


def run():
    print("啟動子程序")
    sleep(3)
    print("結束子程序")


if __name__ =="__main__":
    print("啟動主程序")
    p = Process(target=run)
    p.start()
    print('========')
    #主程序的結束不能影響子程序,隨意可以等待子程序結束在結束主程序

    #等待子程序結束,才能繼續執行主程序
    #後期主程序主要做的是排程相關的工作,不具體負責業務邏輯
    p.join()
    print('--------')

    print("結束主程序")

程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令、資料及其組織形式的描述,程序是程式的實體

對於作業系統來說 一個任務就是一個程序比如說開啟一個瀏覽器就是啟動一個瀏覽器的程序,在開啟一個記事本就啟動了一個記事本進

練習:多執行緒遍歷目錄

import os,time
from  multiprocessing import Pool#Pool程序池
def run(path):
    files = os.listdir(path)
    for item in files:
        print(os.path.join(path,item))
if __name__=='__main__':
    path = r"E:\Python練習"
    filesList  =os.listdir(path)
    t1 = time.time()
    pool =Pool(5)
    for filename in filesList:
        absPath = os.path.join(path,filename)
        # print(absPath)
        pool.apply_async(run,args=(absPath,))
            pool.close()#我們要告訴主程序,你等著所有子程序執行完畢後在執行剩餘部分  #close必須在join前呼叫
    pool.join()
    t2 = time.time()
    print(t2-t1)

os.listdir() 方法用於返回指定的資料夾包含的檔案或資料夾的名字的列表。這個列表以字母順序。 它不包括 ‘.’ 和’…’ 即使它在資料夾中。

只支援在 Unix, Windows 下使用
#apply方法是阻塞的。意思就是等待當前子程序執行完畢後,在執行下一個程序
#apply_async 是非同步非阻塞的。意思就是:不用等待當前程序執行完畢,隨時根據系統排程來進行程序切換
‘’’
apply是阻塞式的。
首先主程序開始執行,碰到子程序,作業系統切換到子程序,等待子程序執行結束後,在切換到另外一個子程序,直到所有子程序執行完畢。然後在切換到主程序,執行剩餘的部分。

apply_async是非同步非阻塞式的。
首先主程序開始執行,碰到子程序後,主程序說:讓我先執行個夠,等到作業系統進行程序切換的時候,在交給子程序執行。以為我們的程式太短,然而還沒等到作業系統進行程序切換,主程序就執行完畢了。

作者:有點d傷
連結:https://www.jianshu.com/p/0a55507f9d9e
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。
‘’’

#非同步非阻塞式;正因為是非同步非阻塞式的,不用等待當前執行的子程序執行完畢,隨時根據系統排程來進行程序切換。基本上主程序和三個子程序,四個程序是同時執行的。

#阻塞式:
#9秒多。以為是阻塞式,需要等待當前子程序執行完畢後,在執行下一個子程序。