2.多工、單核cpu、多核cpu、併發、並行
單核cpu實現多工的原理:時間片輪轉
單核cpu同一時間只能執行乙個程式,但是為什麼你能感覺同時執行了好多個程式?
因為單核cpu的快速切換,即把乙個程式拿過來執行極短的時間比如0.00001秒,就換執行下乙個程式,如此往復,就是你看到的同一時間執行多個程式。這是作業系統實現多工的一種方式,但其實是偽多工。
時間片輪轉的理念:利用人眼看到時間與程式執行的時間的偏差,通過快速切換程式,瞞過眼睛,區別不出來切換了程式。
並行、併發
如果是多核cpu同時執行多個任務,我們就稱之為並行,是真的多工;任務數少於cpu數量;
如果是單核cpu切換著執行多個任務,我們就稱之為併發,是假的多工。任務數多於cpu數量;
但因為日常中,任務數一般多於cpu核數,所以我們說的多工一般都是併發,即假的多工;
什麼是程序?
程式執行,資源分配的單位
用程序如何實現多工?
1
. 匯入multiprocessing;
2. 編寫多工所所需要的函式;
3. 建立multiprocessing.process類的例項物件並傳入函式引用;
4. 呼叫例項物件的start方法,建立子程序。
test1、test2同時執行
import multiprocessing ,time
deftest1()
:for i in
range(10
):time.sleep(1)
print i
deftest2()
:for i in
range(10
):time.sleep(1)
print
('test %d'
%i)print
('test start'
)process1 = multiprocessing.process(target= test1)
process2 = multiprocessing.process(target= test2)
process1.start(
)#啟動子程序時,複製了乙份主程序的所有資源和**
process2.start(
)
通過 在cmd命令列 : ps -aux 可以看到有3個程序(其中1個是主程序,2個子程序)
程序剖析:
主程序有什麼,子程序就會有什麼資源;
執行緒能建立多工,程序也能建立多工,但程序耗費的資源比較大;所以執行的程序數,不一定越多越好;
當建立子程序時,會複製乙份主程序的資源,**,記憶體等,但又會有自己不同的地方,比如pid等;
我們可以理解為多程序之間共享**,即只有乙份**,但有多個指向同一**的箭頭;能共享的就共享,不能共享的就拷貝乙份;不需要修改的就共享,要修改的時候就給你拷貝乙份,這就是寫時拷貝
什麼是執行緒?
作業系統排程的單位
多執行緒實現多工
1
.匯入threading模組;
2.編寫多工所需要的的函式;
3.建立threading.thread類的例項物件並傳入函式引用;
4.呼叫例項物件的start方法,建立子執行緒。
核心
import threading
th = threading.thread(target = function_name)
th.start(
)
注意:
①乙個thread例項物件只能有乙個執行緒
關於target = function_name : 只能寫函式名,不能寫function_name(),
* 函式名() 表示函式的呼叫
* 函式名 表示使用對函式的引用,告訴函式在哪,即指向該函式;
知識點:變數q= 函式名 -------變數q指向該函式
②關於th.start() : 執行start(),即自動建立乙個子執行緒
import threading ,time
deftest1()
:for i in
range(10
):time.sleep(1)
print i
deftest2()
:for i in
range(10
):time.sleep(1)
print
('test %d'
%i)thread1 = threading.thread(target= test1)
thread2 = threading.thread(target= test2)
thread1.start(
)thread2.start(
)
主線程和子執行緒
當程式執行**起來---------這個是主線程,只有乙個主線程
當**執行到start()函式時-------會自動建立乙個子執行緒
如何確定執行緒的執行順序?
因執行緒的執行是沒有順序的,隨機的。可通過延時time.sleep(),讓執行緒誰先執行,誰後執行。
子執行緒何時結束?
當建立thread時執行的那個函式,該函式執行完,意味著該子執行緒結束
6.給子執行緒傳參
g_num =[1
,3]threading.thread(target = function_name, args=
(g_num,))
#args 是個元組
7.通過繼承thread類來建立執行緒
前面我們是通過子執行緒呼叫乙個函式,那麼當函式過多時,想將那些函式封裝成乙個類,我們可以不可以通過子執行緒呼叫乙個類呢?
1
.匯入threading模組
2.定義乙個繼承threading.thread的類,並該類中定義乙個run(
)函式3
.建立該類的例項物件
4.例項物件呼叫start(
)函式注意:
thread類的start(
)函式,就是呼叫thread類中的run(
)
import threading ,time
class
test
(threading.thread)
:def
test1
(self)
:for i in
range(10
):time.sleep(1)
print i
deftest2
(self)
:for i in
range(10
):time.sleep(1)
print
('test %d'
%i)def
run(self)
: self.test1(
) self.test2(
)test = test(
)test.start(
)
8. 多執行緒之間共享全域性變數
9. 多執行緒之間共享問題:資源競爭-----互斥鎖,解決資源競爭
10. 死鎖問題
Python多工之程序
python通過多程序實現多工的幾種方法 只用在類unix linux系統中有效,windows系統中無效 fork函式呼叫一次,返回兩次 在父程序中返回值為子程序id,在子程序中返回值為0 import os ret os.fork if ret 父程序 print 主程序,pid format ...
python 多工 程序
什麼是程序?程式是靜態的,當程式執行起來就叫做程序。程序是作業系統分配資源的基本單元。程序 執行緒的區別與優缺點 1.定義的不同 程序是系統進行資源分配的最小單位.執行緒是程序的乙個實體,是cpu進行排程的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源 如程式計數器,一組...
Python多工學習筆記(7) 程序
下面是一段簡單的用python語言實現的多程序 對比python多工學習筆記 1 執行緒中通過thread類建立執行緒物件實現多工的 可以發現二者十分類似,只是將包名由threading換成了multiprocessing,將類名由thread換成了process。import multiproce...