1、進程和線程併發
進程dom
咱們都知道計算機的核心是CPU,它承擔了全部的計算任務,而操做系統是計算機的管理者,它負責任務的調度,資源的分配和管理,函數
統領整個計算機硬件;應用程序是具備某種功能的程序,程序是運行於操做系統之上的。spa
進程是一個具備必定獨立功能的程序在一個數據集上的一次動態執行的過程,是操做系統進行資源分配和調度的一個獨立單位,是應用操作系統
程序運行的載體。進程是一種抽象的概念,歷來沒有統一的標準定義。進程通常由程序,數據集合和進程控制塊三部分組成。程序用於描述線程
進程要完成的功能,是控制進程執行的指令集;數據集合是程序在執行時所須要的數據和工做區;程序控制塊包含進程的描述信息和控制信息指針
是進程存在的惟一標誌code
進程具備的特徵:對象
動態性:進程是程序的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;blog
併發性:任何進程均可以同其餘進行一塊兒併發執行;
獨立性:進程是系統進行資源分配和調度的一個獨立單位;
結構性:進程由程序,數據和進程控制塊三部分組成
線程
在早期的操做系統中並無線程的概念,進程是擁有資源和獨立運行的最小單位,也是程序執行的最小單位。任務調度採用的是時間片
輪轉的搶佔式調度方式,而進程是任務調度的最小單位,每一個進程有各自獨立的一塊內存,使得各個進程之間內存地址相互隔離。
後來,隨着計算機的發展,對CPU的要求愈來愈高,進程之間的切換開銷較大,已經沒法知足愈來愈複雜的程序的要求了。因而就發明
了線程,線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程能夠有一個或
多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。一個標準的線程由線程ID,當前指令指針PC,寄存器和堆棧組
成。而進程由內存空間(代碼,數據,進程空間,打開的文件)和一個或多個線程組成。
併發和並行
進程和線程的區別
1. 線程是程序執行的最小單位,而進程是操做系統分配資源的最小單位;
2. 一個進程由一個或多個線程組成,線程是一個進程中代碼的不一樣執行路線
3. 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段,數據集,堆等)及一些進程級的資源(如打開文件和信
號等),某進程內的線程在其餘進程不可見;
4. 調度和切換:線程上下文切換比進程上下文切換要快得多
多進程
1 from random import randint 2 from time import time, sleep 3 4 5 def download_task(filename): 6 print('開始下載%s...' % filename) 7 time_to_download = randint(5, 10) 8 sleep(time_to_download) 9 print('%s下載完成! 耗費了%d秒' % (filename, time_to_download)) 10 11 12 def main(): 13 start = time() 14 download_task('Python從入門到住院.pdf') 15 download_task('Peking Hot.avi') 16 end = time() 17 print('總共耗費了%.2f秒.' % (end - start)) 18 19 20 if __name__ == '__main__': 21 main()
1 def count(func): 2 def warp(*args,**kwargs): 3 num = kwargs['num'] 4 if num > 4: 5 print('404') 6 else: 7 return func(*args,**kwargs) 8 return warp
運行下面這個文件夾
1 from page import count 2 3 @count 4 def page_1(num): 5 print('頁面詳情') 6 7 if __name__ == '__main__': 8 for i in range(10): 9 page_1(num = i)