多工原理,執行緒,程序

2021-08-19 22:49:40 字數 3464 閱讀 3942

一. 現代作業系統(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

六. 程序池pool
from 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...