一. 現代作業系統(windows,mac os x, linux, unix等)都支援」多工」
二. 單任務現象
from time import sleep
defrun
():while
true:
print("sunck is a nice man")
sleep(1.2)
if __name__ == "__main__":
while
true:
print("sunck is a good man")
sleep(1)
#不會執行到run方法,只有上面的while迴圈結束才可以執行, 這就是單個程序的侷限性, 從上往下必須挨著順序執行,碰到死迴圈就嗝屁了, 下面的**就不會再執行了!!!
run()
三. 啟動程序實現多工from multiprocessing import process
'''multiprocessing 庫
跨平台版本的多程序模組,提供了乙個process類來代表乙個程序物件
'''from time import sleep
import os
defrun
(str):
while
true:
#os.getpid()獲取當前程序id號
#os.getppid()獲取當前程序的父程序id號
print("sunck is a %s man--%s--%s"%(str,'當前程序號:%s' % os.getpid(), '父程序號:%s' % os.getppid()))
sleep(5)
if __name__ == "__main__":
print("主/父程序啟動--%s"%(os.getpid()))
#建立子程序
#target說明程序執行的任務
p = process(target=run, args=["handsome"]) # 建立子程序, 執行函式run, 傳入引數handsome, 注意元組裡面只有乙個元素的時候必須加逗號
#啟動程序
p.start()
while
true:
print("sunck is a good man")
sleep(5)
執行結果:
主/父程序啟動--11536
sunck is a good man
sunck is a handsome man--當前程序號:11676--父程序號:11536
sunck is a good man
sunck is a handsome man--當前程序號:11676--父程序號:11536
四. 程序間的先後順序from multiprocessing import process
from time import sleep
defrun
(str):
print("子程序啟動")
sleep(3)
print("子程序結束")
if __name__ == "__main__":
print("父程序啟動")
p = process(target=run, args=("handsome",))
p.start()
#父程序的結束不能影響子程序,讓父程序等待子程序結束,再執行父程序
p.join() # 讓父程序阻塞在這裡, 等待子程序結束後再執行以下語句
print("父程序結束")
五. 全域性變數在程序間不能共享from multiprocessing import process
num = 100
defrun
(): print("子程序開始")
global num #global表示引用全域性變數num, 相當於num = 100
n = 0
while n < 4:
num += 1
n += 1
print("子程序結束num:%d" %(num))
if __name__ == "__main__":
print("父程序開始")
p = process(target=run)
p.start()
p.join()
#在子程序中修改全域性變數對父程序中的全域性變數沒有影響
#在建立子程序時對全域性變數做了乙個備份,父程序中的與子程序中的num是完全不同的兩個變數
print("父程序結束num:%d" %(num))
結果如下:
父程序開始
子程序開始
子程序結束num
:104
父程序結束num
:100
六. 程序池poolfrom multiprocessing import process,pool
import os,time,random
defrun
(name):
print("子程序%d啟動--%s"%(name , os.getpid()))
start = time.time()
time.sleep(random.choice([1,2,3]))
end = time.time()
print("子程序%d結束--%s--耗時%.2f"%(name , os.getpid(), end -start))
if __name__ == "__main__":
print("父程序啟動")
#建立多個程序
#程序池
#表示可以同時執行的程序數量
#pool預設大小是cpu核心數
pp = pool()
for i in range(10):
#建立程序,放入程序池中統一管理
#在呼叫join之前必須先呼叫close,並且呼叫close之後就不能再繼續新增新的程序了
pp.close() #close以後程序池pp將被關閉,不能再繼續向pp中加入新的程序.
#程序池物件呼叫join,會等待程序池中所有的子程序結束完畢再去執行父程序
pp.join()
print("父程序結束")
多工 程序
import time import multiprocessing deftest1 while true print 1 time.sleep 1 deftest2 while true print 2 time.sleep 1 defmain t1 threading.thread targe...
多工原理
單核cpu實現多工原理 輪流讓各個任務交替執行,cpu排程資料快,導致我們感覺所有任務同時執行。多核cpu實現多工原理 多工在多核cpu上實現,由於任務數量遠遠多於cpu核心數量,所以作業系統自動把很多任務輪流排程每個核心上執行。併發 任務數多於cpu核心數 並行 任務數小於等於cpu核數 io密集...
多工 執行緒
建立函式 建立執行緒物件,並制定函式 開啟執行緒 import threading import time defwork1 1.定義函式 for i in range 5 print 正在掃地 i time.sleep 1 defmain 測試執行緒的基本使用 2.建立執行緒物件 t1 threa...