python—線程(1)

===================================
好久麼更新了 今天終於重回大家視野

希望大家在特殊時期儘量不要出門!

武漢必勝!! 中國必勝!!!

===================================
說線程之前先來說說進程池吧

當需要創建的子進程數量不多時,我們可以直接利用multiporcessing中的Process動態生成多個進程,

但是如果現在有100個任務需要處理,那我們需要多少個子進程呢,如果我們創建100個子進程也可以實現,但是資源比較浪費。我們也可以創建指定個數個子進程,

例如
只創建10個子進程,讓着10個子進程重複的執行任務,這樣就節約了資源。
就比如我們去景區湖上游玩,遊船是重複利用的。
我們可以使用multiprocessing模塊提供的Pool類,也就是進程池,可以到達進程重複利用。瀘沽島
創建進程池對象的時候可以指定一個大進程數,當有新的請求提交到進程池中,如果池中的進程數還沒有滿,那麼就會創建一個新的進程用來執行該請求,但是如果池中的進程數滿了,該請求就會等待,知道進程池中的進程有結束的了,纔會使用這個結束的進程來執行新的任務。

join 主進程等待所有子進程執行完畢,必須在close之後。
close 等待所有進程結束才關閉線程池

小練習:下載器

import time
from multiprocessing import Pool
def down_load(movie_name):
    """下載器"""
    for i in range(5):
        print("電影:{},下載進度{}%".format(movie_name,(i/4*100)))
        time.sleep(1)
    return movie_name

def alert(movie_name):
    print("電影:{}下載完成了。。。。".format(movie_name))

if __name__=="__main__":
    movie_list=["鋼鐵俠","蜘蛛俠","美國隊長","死侍","黑豹","黑寡婦"]
    pool = Pool(3) # 創建進程池
    for movie_name in movie_list:
        # 調用進程池
        pool.apply_async(down_load,(movie_name,),callback=alert)
    pool.close()
    pool.join()

結果:

電影:鋼鐵俠,下載進度0.0%
電影:蜘蛛俠,下載進度0.0%
電影:美國隊長,下載進度0.0%
電影:蜘蛛俠,下載進度25.0%
電影:鋼鐵俠,下載進度25.0%
電影:美國隊長,下載進度25.0%
電影:鋼鐵俠,下載進度50.0%
電影:蜘蛛俠,下載進度50.0%
電影:美國隊長,下載進度50.0%
電影:鋼鐵俠,下載進度75.0%
電影:蜘蛛俠,下載進度75.0%
電影:美國隊長,下載進度75.0%
電影:鋼鐵俠,下載進度100.0%
電影:蜘蛛俠,下載進度100.0%
電影:美國隊長,下載進度100.0%
電影:死侍,下載進度0.0%
電影:蜘蛛俠下載完成了。。。。
電影:黑豹,下載進度0.0%
電影:鋼鐵俠下載完成了。。。。
電影:美國隊長下載完成了。。。。
電影:黑寡婦,下載進度0.0%
電影:死侍,下載進度25.0%
電影:黑豹,下載進度25.0%
電影:黑寡婦,下載進度25.0%
電影:死侍,下載進度50.0%
電影:黑豹,下載進度50.0%
電影:黑寡婦,下載進度50.0%
電影:黑豹,下載進度75.0%
電影:死侍,下載進度75.0%
電影:黑寡婦,下載進度75.0%
電影:黑豹,下載進度100.0%
電影:死侍,下載進度100.0%
電影:黑寡婦,下載進度100.0%
電影:黑豹下載完成了。。。。
電影:死侍下載完成了。。。。
電影:黑寡婦下載完成了。。。。

1、 線程概念
由於進程是資源擁有者,創建、撤消與切換存在較大的內存開銷,因此需要引入輕型進程即線程,

進程是資源分配的小單位,線程是CPU調度的小單位(程序真正執行的時候調用的是線程).

每一個進程中至少有一個線程

在這裏插入圖片描述

2.

線程之間共享全局變量

import threading

g_num=100

def work1():
    global g_num
    g_num+=1
    print("work--->",g_num)
def work2():
    print("work2--->",g_num)


def main():
    t1=threading.Thread(target=work1)
    t2=threading.Thread(target=work2)
    t1.start()
    t2.start()

if __name__ == '__main__':
    main()

量的問題

多線程開發的時候共享全局變量會帶來資源競爭效果。也就是數據不安全。

import time
import random
from  threading import  Thread
g_num=100
def work1():
    global g_num
    for i in range(3):
        g_num+=1
        time.sleep(random.random())
    print("in work,g_num=%d"%g_num)

def work2():
    global g_num
    # g_num+=1
    for i in range(3):
        g_num+=1
        time.sleep(random.random())
        print("in work2,g_num=%d"%g_num)
if __name__ == '__main__':
    t1=Thread(target=work1)
    t2=Thread(target=work2)
    t1.start()
    t2.start()

今天先到這裏 明天見!

發佈了37 篇原創文章 · 獲贊 49 · 訪問量 4063
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章