1. 程式人生 > >多進程與多線程

多進程與多線程

self 睡眠 數據集 另一個 工作 time 表示 print run

什麽是進程?

進程就是一個程序在一個數據集上的一次動態執行過程。

進程一般由程序、數據集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標誌。

單核CPU對進程進行切換的過程叫做並發,並發的概念就是進程在執行過程中,需要切換到另一個進程時,保留現在進程狀態,運行其他進程。看似是程序同時進行,其實並不是,只是切換的過程快。

多核cpu對進程進行切換的過程叫做並行,並行就是進程可以同時在cpu中執行,是實際意義的同時共同執行。

什麽是線程?

線程的出現解決了一個進程只能做一件事的缺陷,實現了上下文管理。線程之間共用數據集。

進程和線程之間的聯系

進程在之前計算機系統中是一個執行單位,當線程出現的時候,線程成了一個實際意義的執行單位。

進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。或者說進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程則是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

總結性的來說,進程是一個資源管理單位,線程是一個最小的執行單位。

一個進程中可以有多個線程(必須有一個線程),一個線程的執行,必須有一個進程。

並發與並行的詳細分析

並行處理(Parallel Processing)是計算機系統中能同時執行兩個或更多個處理的一種計算方法。並行處理可同時工作於同一程序的不同方面。並行處理的主要目的是節省大型和復雜問題的解決時間。並發處理(concurrency Processing):指一個時間段中有幾個程序都處於已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機(CPU)上運行,但任一個時刻點上只有一個程序在處理機(CPU)上運行

並發的關鍵是你有處理多個任務的能力,不一定要同時。並行的關鍵是你有同時處理多個任務的能力。所以說,並行是並發的子集

python中使用多線程示例:

直接定義多線程,(線程在使用中都是一個個對象,所以需要在使用時先實例化線程類)

 1 import threading
 2 import time
 3 
 4 def countNum(n): # 定義某個線程要運行的函數
 5 
 6     print("running on number:%s" %n)
 7 
 8     time.sleep(3)
 9 
10 t1 = threading.Thread(target=countNum,args=(23,)) #生成一個線程實例
11 t2 = threading.Thread(target=countNum,args=(34,))
12 
13 t1.start() #啟動線程
14 t2.start()
15 
16  print("ending!")

繼承的方式使用多線程

import threading,time
#其實python中程序本身就是一個主線程,當開啟其他線程後,主線程依舊會進行
class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        #super().__init__(self)
        self.num=num
    def run(self):
        print("打印參數",self.num)
        print("子進程",self)

t1=MyThread(10)#實例化線程
t2=MyThread(20)

t1.start()#開啟線程
t2.start()

print("主進程結束")

全局解釋器鎖GIL

python代碼的執行是由python解釋器(解釋器主循環)進行控制。python在設計之初考慮到主循環中只能有一個控制線程在執行,就像單核cpu下的多進程一樣。內存中有多個程序,但是在給定時刻只能有一個程序在運行。python解釋器中盡管也能運行多個線程,但是在給定時刻只有一個線程會被執行。

多線程下的python的執行方式

1.設置GIL

2.切換到一個線程去運行

3.執行操作

  指定 數量的字節碼指令

  線程主動讓出控制權(可以調用time.sleep()完成)

4.把線程設置回睡眠狀態(切換出線程)

5.解鎖GIL

守護進程

什麽是守護進程?

守護進程進程就是一個隨著著進程結束而結束的進程。通常這類進程是不重要的。設置守護的進程的語法為:在進程之前執行賦值語句thread.daemon=True

join方法

join的使用就是線程對象調用join方法,表示該線程不結束,不執行主線程。主線程在執行時,會等待該線程完成後再執行。

多進程與多線程