python3的使用
下面分別是python 進一步封裝好的線程池 和進程池
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
import time
def task(arg):
print(arg)
time.sleep(1)
pool= ProcessPoolExecutor
pool= ThreadPoolExecutor
for i in range(50):
pool.submit(task,i)
一孽亲、再次了解相同區(qū)別
進程:
優(yōu)點:同時利用多個cpu,能夠同時進行多個操作
缺點:耗費資源(因為給開辟內(nèi)存空間)
線程:
優(yōu)點:共享內(nèi)存,io操作的時候,創(chuàng)作并發(fā)操作
缺點:搶占資源
進程:不是越多越好,cpu個數(shù)等于進程個數(shù)
線程:也不是越多越好,具體案例具體分析,請求上下文切換耗時,計算機中執(zhí)行任務(wù)的最小單元是線程
二禀忆、目的
進程和線程目的:提高效率
Io操作不利用cpu:
IO密集型(不使用cpu):多線程----GIL全局解釋器鎖
計算密集型(使用cpu):多進程
三、進程
1.創(chuàng)建進程
from multiprocessing import Process
def test(n):
print(n)
if __name__ == '__main__':
for i in range(4):
p = Process(target=test,args=(i,))
p.start()
2.進程中的join等待落恼,等待進程結(jié)束運行下一個進程
未使用join運行結(jié)果
from multiprocessing import Process
import time
def test(n):
print(n)
time.sleep(2)
if __name__ == '__main__':
for i in range(4):
p = Process(target=test,args=(i,))
p.start()
print("end")
》》》
end
0
3
1
2
使用join
from multiprocessing import Process
import time
def test(n):
print(n)
time.sleep(2)
if __name__ == '__main__':
for i in range(4):
p = Process(target=test,args=(i,))
p.start()
#等待的意思
p.join()
print("end")箩退、
》》》
0
1
2
3
end
3.deamon 等同線程中setdeamon線程守護
from multiprocessing import Process
import time
def test(n):
print(n)
time.sleep(2)
if __name__ == '__main__':
for i in range(4):
p = Process(target=test,args=(i,))
# 進程守護,結(jié)束都結(jié)束
p.daemon = True
p.start()
print("end")
四佳谦、通過代碼理解進程
進程可以理解成是對主進程的copy~戴涝,也就是如果線程對一個列表操作的話,實際上是對同一個列表操作,進程操作的就是復(fù)制出來的列表
from multiprocessing import Process
import time
a_list = []
def test(n):
a_list.append(n)
print(a_list)
if __name__ == '__main__':
for i in range(4):
p = Process(target=test,args=(i,))
p.start()
print("end")
>>>
end
[0]
[1]
[3]
[2]
五喊括、進程池
p = Pool(5)
p.apply 每一個任務(wù)都是排隊進行的胧瓜,相當(dāng)于自身包含個join方法
p.apply_async 每一個任務(wù)都是并發(fā)進行的,可以設(shè)置回調(diào)函數(shù)郑什,deamon=True府喳,等待線程
進程和線程其實還有一點區(qū)別,就是如果主線程執(zhí)行完畢蘑拯,其實子線程還是在運行的钝满,除非設(shè)置了保護線程。單進程不是這樣申窘,如果主進程結(jié)束了弯蚜,子進程也不會執(zhí)行
from multiprocessing import Pool
import time
def f1(a):
time.sleep(1)
print(a)
if __name__ == '__main__':
pool = Pool(5)
for i in range(10):
pool.apply_async(func=f1,args=(i,))
上面的代碼運行結(jié)果沒有的,因為主進程結(jié)束了剃法,子進程還在sleep等待碎捺,主進程銷毀了子進程也跟著銷毀了
有兩種辦法解決,方法一主進程的結(jié)束時間大于子進程
from multiprocessing import Pool
import time
def f1(a):
time.sleep(1)
print(a)
if __name__ == '__main__':
pool = Pool(5)
for i in range(10):
pool.apply_async(func=f1,args=(i,))
time.sleep(2.5)
第二種使用join進程等待
from multiprocessing import Pool
import time
def f1(a):
time.sleep(1)
print(a)
if __name__ == '__main__':
pool = Pool(5)
for i in range(10):
pool.apply_async(func=f1,args=(i,))
pool.close()
pool.join()
上面的代碼運行的時候五個為一個結(jié)果展示