===================================
好久麼更新了 今天終於重回大家視野
希望大家在特殊時期儘量不要出門!
武漢必勝!! 中國必勝!!!
===================================
說線程之前先來說說進程池吧
當需要創建的子進程數量不多時,我們可以直接利用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()
今天先到這裏 明天見!