線程

線程

一、什麼是線程

​ 進程:資源單位python

​ 線程:執行單位安全

線程與進程都是虛擬的概念,爲了更好的表達某種事物app

注意:開啓一個進程,必定會自帶一個線程,線程纔是真正的執行者ui

二、爲何要使用線程

節省資源的佔用線程

開啓進程:code

​ 一、產生一個內存空間,申請一塊資源對象

​ 二、會自帶一個主線程進程

​ 三、開啓子進程的速度要比開啓子線程的速度慢內存

開啓線程:資源

​ 一、一個進程內能夠開啓多個線程,從進程的內存空間中申請執行單位

​ 二、節省資源

開啓幾個進程就會開闢幾個內存空間,開闢幾個線程是在同一個內存空間中申請幾個執行單位

三、使用線程

同進程的使用類似,調用的是Thread生成對象obj,經過obj.start()開啓線程

from threading import Thread
import time
# 方式1:直接調用
num = 100

def task():
    global num
    num = 200
    print('開啓子線程')
    time.sleep(1)
    print('子線程結束')

if __name__ == '__main__':
    t = Thread(target=task)
    t.start()

    print('主進程(主線程)結束') # 子線程要比子進程開啓快
    # 開啓子線程
    # 主進程(主線程)結束
    # 子線程結束
from threading import Thread
import time

num = 10
# 方式2:定義類,並重寫run方法
class Mythread(Thread):
    # 重寫run方法
    def run(self):
        print('開啓子線程')
        time.sleep(1)
        print('子線程結束')

if __name__ == '__main__':
    t = Mythread()
    # 建立子線程
    t.start()
    # 讓子線程結束後主進程才結束
    t.join()
    print('主進程(主線程)結束')
    # 開啓子線程
    # 子線程結束
    # 主進程(主線程)結束

四、守護線程

當主線程結束後,子線程也當即結束,並回收,經過 obj.daemon = True 定義在obj.start() 以前設置

from threading import Thread
# 當前線程
from threading import current_thread
import time
num = 10
def task():
    global num
    num = 20
    print('開啓子線程')
    time.sleep(1)
    print('子線程結束')

if __name__ == '__main__':
    t = Thread(target=task)
    t.daemon = True
    t.start()
    # current_thread().name查看當前線程名
    print(f'主進程(主線程)結束{current_thread().name}')
    # 開啓子線程
	# 主進程(主線程)結束MainThread

五、線程互斥鎖

互斥鎖是用來保證數據讀寫安全的,在修改同一個數據時,同一時間只能有一個任務能夠進行修改,即串行的修改,保證數據安全

from threading import Thread
from threading import Lock
import time
lock = Lock()

num = 10
def task():
    global num
    lock.acquire()
    time.sleep(1)
    num += 1
    lock.release()
if __name__ == '__main__':
    list1 = []
    for i in range(10):
        t = Thread(target=task)
        t.start()
        list1.append(t)
    for t in list1:
        t.join()
    print(num)  # 20

六、線程池

每個線程的從生成到消亡也是須要時間和資源的,太多的線程會佔用過多的系統資源(內存開銷,cpu開銷),並且生成太多的線程也是須要時間的,極可能會得不償失 ,線程池是用來限制每次線程的數量

from concurrent.futures import ThreadPoolExecutor
import time

# 每次線程的數量爲10
pool = ThreadPoolExecutor(10)


def task(line):
    print(line)
    time.sleep(5)


if __name__ == '__main__':
    for line in range(100):
        pool.submit(task, line)
相關文章
相關標籤/搜索