python中多執行緒詳細說明

2021-09-01 09:17:00 字數 3887 閱讀 5253

多執行緒指的是從軟體或者硬體上實現多個執行緒併發執行的技術,通俗上說就是同時執行的多個任務。(同時執行多個任務就是並行,這是個偽概念,因為pycharm的執行機制決定了不可能真正實現並行)

1.併發: 指的是任務數多餘 cpu 核數,通過作業系統的各種任務排程演算法

2.並行:指的是任務數小於等於 cpu 核數,即任務真的是一起執行的

#導包:

import threading

import time

#子執行緒1:

def sing():

for i in range(3):

print("正在唱歌")

#休息1s:

time.sleep(1)

#子執行緒2:

def dance():

for i in range(3):

print("正在跳舞")

time.sleep(1)

#主線程:

def main():

t1 = threading.thread(target=sing)

t2 = threading.thread(target=dance)

#當呼叫thread的時候,不會建立執行緒

#當呼叫thread建立出來的例項物件呼叫start方法的時候,才會建立執行緒

t1.start()

t2.start()

if __name__ == "__main__":

main()

開始:當呼叫thread建立出來的例項物件呼叫start方法的時候,才會建立執行緒

結束:當子執行緒結束後,主線程才會結束。

num1 = 100

num2 = [11,22]

def text1():

global num1

num1 += 100

def text2():

print(num1)

print(num2)

text1()

text2()

print(num1)

print(num2)

輸出為:

100[11, 22]

200[11, 22, 33]

import threading

import time

#定義乙個全域性變數:

gl_num = 10

#定義兩個子執行緒:

def text1():

#global宣告變數(不可變型)

global gl_num

gl_num += 1

print("此時text1的值為: %d"%gl_num)

def text2():

print("此時text2的值為: %d"%gl_num)

#定義主線程:

def main():

t1 = threading.thread(target=text1)

t2 = threading.thread(target=text2)

t1.start()

time.sleep()

t2.start()

time.sleep()

print("此時main的值為: %d"%gl_num)

if __name__ == "__main__":

main()

2.可變型:(args)

import threading

import time

#定義乙個列表的全域性變數:

num = [66,88]

#定義兩個子執行緒:

def text1(temp): #temp:形參

#新增變數:

print("此時text1的值為: %s"%str(temp))

def text2(temp):

print("此時text2的值為: %s"str(temp))

#定義乙個主線程:

def main()

t1 = threading.tread(target = text1,args(num,)) #num:表示上面的全域性變數,是個實參

t2 = threading.tread(target = text2,args(num,))

t1.start()

time.sleep(1)

t2.start()

time.sleep(1)

if __name__ =="__main__":

main()

輸出為:此時text1的值為: [66, 88, 99]

此時text2的值為: [66, 88, 99]

互斥鎖概念以及產生:

用來解決多執行緒共享全域性變數時出現的資源競爭問題。

當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制。

threading 模組中定義了 lock 類,可以方便的處理鎖定:

#1. 建立鎖

mutex = threading.lock()

# 2.鎖定

mutex.acquire()

# 3.釋放

mutex.release()

注意:把上鎖mutex.acquire()和解鎖mutex.release()寫在了以下**的for裡面,是以多執行緒修改全域性變數的。若寫在了for的外面就是以單執行緒進行修改全域性變數的。

import threading

import time

#定義乙個全域性變數:

gl_num = 0

#建立乙個互斥鎖的這個類:

mutex = threading.lock()

def text1(num):

global gl_num

for i in range(num):

# 上鎖:

mutex.acquire()

gl_num += 1

#解鎖:

mutex.release()

print("此時text1的值為: %d"%gl_num)

def text2(num):

global gl_num

for i in range(num):

# 上鎖:

mutex.acquire()

gl_num += 1

#解鎖:

mutex.release()

print("此時text2的值為: %d"%gl_num)

def main():

t1 = threading.thread(target=text1,args=(10000000,))

t2 = threading.thread(target=text2,args=(10000000,))

t1.start()

t2.start()

time.sleep(2)

print("此時main的值為: %d"%gl_num)

if __name__ == '__main__':

main()

死鎖的狀態:

當進入死鎖後,2個執行緒互相等待對方的鎖,互相占用著資源不釋放。程式不報錯也不執行。

避免死鎖:

正確有序的分配資源;程式設計時要盡量避免(銀行家演算法);

新增超時時間等

Struts config xml 詳細說明

頁面中表單對應的bean儲存表單資料,驗證 type hello.helloform formbean 對應的包名.類名 路徑的邏輯名,此項必須有 path action1.do 指向 或重定向的uri.此項是必需的,必須以 開頭.請求訪問action的路徑,必須以 開頭 type hello.he...

Struts config xml 詳細說明

頁面中表單對應的bean儲存表單資料,驗證 type hello.helloform formbean 對應的包名.類名 name forward1 路徑的邏輯名,此項必須有 path action1.do 指向 或重定向的uri.此項是必需的,必須以 開頭.name forward2 path a...

Linux free m 詳細說明

linux記憶體中buffer與cache的區別 free 命令相對於top 提供了更簡潔的檢視系統記憶體使用情況 free total used free shared buffers cached mem 255268 238332 16936 0 85540 126384 buffers ca...