併發程式設計之多執行緒篇之一

2022-09-16 09:30:14 字數 4132 閱讀 4394

本節主要知識點包括三個方面

一、執行緒的含義

二、程序和執行緒的區別

三、開啟程序的兩種方式

1️⃣什麼是執行緒和多執行緒?

1、在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程。

執行緒顧名思義,就是一條流水線工作的過程(流水線的工作需要電源,電源就相當於cpu),

而一條流水線必須屬於乙個車間,乙個車間的工作過程是乙個程序,車間負責把資源整合到一起,

是乙個資源單位,而乙個車間內至少有一條流水線。

注意:程序只是用來把資源集中到一起(程序只是乙個資源單位,或者說資源集合),而執行緒才是cpu上的執行單位。

2、多執行緒(即多個控制線程)的概念是,在乙個程序中存在多個執行緒,多個執行緒共享該程序的位址空間,

相當於乙個車間內有多條流水線,都共用乙個車間的資源。

2️⃣ 執行緒與程序的區別

歸根結底,執行緒和程序的區別包括以下兩點,這也是我們在特定的場景下需要使用多執行緒的原因:

同乙個程序內的多個執行緒共享該程序內的位址資源

建立執行緒的開銷要遠小於建立程序的開銷(建立乙個程序,就是建立乙個車間,涉及到申請空間,而且在該空間內建至少一條流水線,但建立執行緒,就只是在乙個車間內造一條流水線,無需申請空間,所以建立開銷小)

多執行緒舉例

開啟乙個字處理軟體程序,該程序肯定需要辦不止一件事情,比如監聽鍵盤輸入,處理文字,

定時自動將文字儲存到硬碟,這三個任務操作的都是同一塊資料,因而不能用多程序。只能在乙個

程序裡併發地開啟三個執行緒,如果是單執行緒,那就只能是,鍵盤輸入時,不能處理文字和自動儲存,

自動儲存時又不能輸入和處理文字。

4、多執行緒和多程序的區別

4.1 在主程序下開啟執行緒

#

!/usr/bin/env python3

#-*- coding:utf-8 -*-

#write by congcong

import

time

from multiprocessing import

process,current_process

from threading import

thread

import

osdef

task():

print('

執行緒2:%s

'%(os.getpid()))

if__name__ == '

__main__':

t = thread(target=task)

t.start()

print('

執行緒1:%s

'%os.getpid())

'''幾乎是t.start() 的同時就將執行緒開啟了,然後執行列印,可見開執行緒開銷極小。

執行緒2:2708

執行緒1:2708

'''

4.2 在主程序下開啟子程序

#

!/usr/bin/env python3

#-*- coding:utf-8 -*-

#write by congcong

import

time

from multiprocessing import

process,current_process

from threading import

thread

import

os

def task():

#print(current_process().pid) # 8180

print('子程序:%s,父程序:%s'%(os.getpid(),os.getppid()))

if __name__ == '__main__':

p1 = process(target=task)

p1.start()

#print('主程序',current_process().pid) # 主程序 1840

print('主程序:%s'%os.getpid())

主程序:5900

子程序:3760,父程序:5900

# p.start ()將開啟程序的訊號發給作業系統後,作業系統要申請記憶體空間,讓好拷貝父程序位址空間到子程序,開銷遠大於執行緒

還能歸結出以下三點:

1、開程序開銷遠大於開執行緒。

2、在主程序下開啟多個執行緒,每個執行緒都跟主程序的pid一樣;多個程序,每個程序都有不同的pid;

3 、同一程序的多個執行緒共享該程序的位址空間。

3️⃣ 開啟程序的兩種方式

3.1 回顧開多程序

from multiprocessing import

process

import

time

import

random

deftask(name):

for i in range(2):

print('

%s執行%s

'%(name,i))

time.sleep(random.randrange(1,3))

if__name__ == '

__main__':

p = process(target=task,args=('

子程序'

,)) p.start()

print('

主程序')

3.2 開啟多執行緒方式一:

import

time

import

random

from threading import

thread

defproducer(name):

for i in range(3):

print('

%s 啟動執行%i

'%(name,i))

time.sleep(random.randrange(1,3))

if__name__ == '

__main__':

#例項化物件

t = thread(target=producer,args=('

執行緒',)) #

括號內必須加逗號

#呼叫物件方法

t.start()

print('

程序') #

開啟程序就相當於在記憶體裡開闢了一塊記憶體空間,具體由執行緒來執行

3.3 開啟多執行緒方式二:

class

mythread(thread):

def__init__

(self,name):

super().

__init__

() self.name =name

def run(self): #

必須是run方法(預設的)

for i in range(3):

print('

%s 開始執行%s

'%(self.name,i))

time.sleep(random.randrange(1,3))

if__name__ == '

__main__':

t = mythread('執行緒'

) t.start()

print('

程序開啟')

'''執行結果:

執行緒 開始執行0

程序開啟

執行緒 開始執行1

執行緒 開始執行2

'''

總結:

1、每啟動乙個程序,這個程序內至少得有乙個執行緒。

2、程序本身只是乙個資源單位,並不是真正執行,程序內的執行緒才是執行單位。

3、乙個程序內可以有多個執行緒,且程序在記憶體中相互隔離,而同乙個程序內的執行緒是共享資源的,各執行緒之間地位是平等的。

4、程序更消耗資源,而執行緒開銷小,是在已有的程序內占用。

python併發程式設計之多執行緒一

一,什麼是執行緒 執行緒也被稱為輕量程序電腦科學術語,指執行中的程式的排程單位。執行緒是程序中的實體,乙個程序可以擁有多個執行緒,乙個執行緒必須有乙個父程序。執行緒不擁有系統資源,只有執行必須的一些資料結構 它與父程序的其它執行緒共享該程序所擁有的全部資源。執行緒可以建立和撤消執行緒,從而實現程式的...

python併發程式設計之多執行緒

程序包含了執行該程式所需要所有資源 程序是乙個資源單位 執行緒是cpu的最小執行單位 每乙個程序一旦被建立 就預設開啟了一條執行緒 稱之為主線程 使用執行緒可以提高程式效率 為何不用多程序提高效率 是因為程序對作業系統的資源耗費非常高 執行緒共享建立它的程序的位址空間 程序有自己的位址空間。執行緒可...

1 3併發程式設計之多執行緒通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。1.因為涉及到物件鎖,他們必須都放在synchronized中來使用.wait notify一定要在synchronized裡面進行使用。2.wait必須暫定當前正在執行的執行緒,並釋放資源鎖,讓其他執行緒可以有機會執行 3....