37.1 如何通俗理解線程和進(jìn)程?
進(jìn)程:進(jìn)程就是正在執(zhí)?的程序。
線程:是程序執(zhí)?的?條路徑, ?個進(jìn)程中可以包含多條線程。
通俗理解:例如你打開抖?,就是打開?個進(jìn)程,在抖???和朋友聊天就是開啟了?條線程。
再舉?個例?:
在某?堂打飯的時候,此?堂安排三個打飯?媽打飯,所有同學(xué)依次排成三個隊伍,每個打飯? 媽相當(dāng)于?個線程。
這個?堂相當(dāng)于?個進(jìn)程,他?共有三個打飯?媽,相當(dāng)于進(jìn)程?有三個線程。
兩者之間的關(guān)系:
?個進(jìn)程??可以有多條線程,?少有?條線程。
?條線程?定會在?個進(jìn)程??。
關(guān)于協(xié)程我會放在后?講完線程和進(jìn)程時再講解。
37.2 Python如何啟動?個線程?
?般的,程序默認(rèn)執(zhí)?只在?個線程,這個線程稱為主線程,例?演示如下:
導(dǎo)?線程相關(guān)的模塊 threading:
import threadin
threading的類?法 current_thread()返回當(dāng)前線程:
t = threading.current_thread()
print(t)
看到 MainThread,驗證了程序默認(rèn)是在MainThead中執(zhí)?。
t.getName()獲得這個線程的名字
其他常??法,t.ident獲得線程id
is_alive() 判斷線程是否存活
那么,如何創(chuàng)建??的線程呢?
下?節(jié)課我們了解:如何在Python中創(chuàng)建?個新線程
my_thread = threading.Thread()
創(chuàng)建線程的?的是告訴它幫助我們做些什么,做些什么通過參數(shù)target傳?,參數(shù)類型為 callable,函數(shù)就是可調(diào)?的
def print_i(end):
for i in range(end):
print(f'打印i={i}')
my_thread = threading.Thread(target=print_i, args=(10,))
my_thread線程已經(jīng)全副武裝,但是我們得按下發(fā)射按鈕,啟動start(),它才開始真正起?。
my_thread.start()
打印結(jié)果如下,其中args指定函數(shù)print_i需要的參數(shù)i,類型為元祖。
打印i=0 打印i=1 打印i=2 打印i=3 打印i=4 打印i=5 打印i=6 打印i=7 打印i=8 打印i=9
?此,多線程相關(guān)的核?知識點,已經(jīng)總結(jié)完畢。但是,僅僅知道這些,還不夠!光紙上談兵, 當(dāng)然遠(yuǎn)遠(yuǎn)不夠。
37.4 【案例】如何理解多線程的?作(交替獲得時間 ?)?
為了更好解釋多線程之間的?作,開辟3個線程,裝到threads中
import time from datetime import datetime import threading
def print_time(): for _ in range(5): # 在 每 個 線 程 中 打 印 5 次
time.sleep(0.1) # 模 擬打 印 前 的相 關(guān) 處 理 邏輯
print('當(dāng)前線程%s,打印結(jié)束時間為:%s'%(threading.current_thread().getName(
threads = [threading.Thread(name='t%d'%(i,),target=print_time) for i in range(3)]
[t.start() for t in threads]
打印結(jié)果如下,t0,t1,t2三個線程,根據(jù)操作系統(tǒng)的調(diào)度算法,輪詢獲得CPU時間?,注意觀察:文章來源:http://www.zghlxwxcb.cn/news/detail-431043.html
37.5 【案例】如何理解多線程搶奪同?個變量?
多線程編程,存在搶奪同?個變量的問題。
?如下?例?,創(chuàng)建的10個線程同時競爭全局變量 a :文章來源地址http://www.zghlxwxcb.cn/news/detail-431043.html
import threading
a = 0
def add1():
global a
a += 1
print('%s adds a to 1: %d'%(threading.current_thread().getName(),a))
threads = [threading.Thread(name='t%d'%(i,),target=add1) for i in range(10)] [t.start() for t in threads]
到了這里,關(guān)于多線程、協(xié)程和多進(jìn)程并發(fā)編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!