本節主要知識點包括三個方面
一、執行緒的含義
二、程序和執行緒的區別
三、開啟程序的兩種方式
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 importprocess
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 開啟多執行緒方式一:
importtime
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 開啟多執行緒方式二:
classmythread(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....