Python筆記 多工之程序 執行緒 協程

2021-10-20 13:28:12 字數 3666 閱讀 5387

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...