多线程threading初识,线程等待
1.線程是程序里面最小的執(zhí)行單元。
2.進(jìn)程是資源的集合。
線程是包含在進(jìn)程里面的,一個(gè)進(jìn)程可以有多個(gè)線程,但只要要有一個(gè)線程。
?
一.多線程,就是N個(gè)線程一起干活:
1.傳統(tǒng)方式,串行,循環(huán)5次需要15s:
import threading,timedef run():time.sleep(3) #干活需要3sprint('哈哈哈')for i in range(5): #串行run()
2.使用多線程并發(fā)的方式,節(jié)省時(shí)間:
import threading,timedef run():time.sleep(3) #干活需要3sprint('哈哈哈') for i in range(5):#并發(fā)
t = threading.Thread(target=run) #實(shí)例化了一個(gè)線程,其中target=執(zhí)行的函數(shù)名t.start() #啟動(dòng)線程
?
?
舉例:多線程爬蟲,比較下并發(fā)和串行的時(shí)間:
?串行方式:
import threading,time,requestsurls = {'baidu':'http://www.baidu.com','hao123':'http://www.hao123.com','taobao':'https://www.taobao.com/' }def down_html(file_name,url):res = requests.get(url).content #返回二進(jìn)制內(nèi)容open(file_name+'.html','wb').write(res) #因此打開的時(shí)候,用wb二進(jìn)制打開 用串行方式 start_time = time.time() for k,v in urls.items():down_html(k,v) end_time = time.time()run_time = end_time - start_time print('下載總共花了%s的時(shí)間'%run_time)串行結(jié)果:
并行方式:這種方式計(jì)算的并發(fā)時(shí)間是不準(zhǔn)確的,因?yàn)樵谶\(yùn)行程序時(shí)默認(rèn)先運(yùn)行主線程,其他線程只是開始運(yùn)行(下載網(wǎng)頁(yè))并不一定結(jié)束(而一個(gè)進(jìn)程中的多個(gè)線程都是相互獨(dú)立的。)主線程負(fù)責(zé)定義函數(shù),啟動(dòng)其他線程等。因此,最終并行運(yùn)行的結(jié)果時(shí)間,僅僅是主線程的運(yùn)行時(shí)間。
?
主線程默認(rèn)有個(gè)主線程子線程:主線程啟動(dòng)子線程?
import threading,time,requestsurls = {'baidu':'http://www.baidu.com','hao123':'http://www.hao123.com','taobao':'https://www.taobao.com/' }def down_html(file_name,url):res = requests.get(url).content #返回二進(jìn)制內(nèi)容open(file_name+'.html','wb').write(res) #因此打開的時(shí)候,用wb二進(jìn)制打開#用并行方式 start_time = time.time() for k,v in urls.items():#因?yàn)閡rls里有3個(gè)Key,因此會(huì)啟動(dòng)3個(gè)線程t = threading.Thread(target=down_html,args=(k,v)) #使用多線程調(diào)用參數(shù)時(shí),必須用args=xx才能傳參 t.start() end_time = time.time() run_time = end_time - start_time print('下載共花了%s時(shí)間'%run_time)并行結(jié)果:
?
線程等待:.join()-----實(shí)現(xiàn)并發(fā)
下面程序運(yùn)行流程:
主線程負(fù)責(zé)啟動(dòng)5個(gè)子線程,把每個(gè)線程放在threads list里,然后等待所有線程等待完畢后,再執(zhí)行end_time = time.time()語句,實(shí)現(xiàn)最后計(jì)算所有線程都結(jié)束的并發(fā)時(shí)間。
主線程默認(rèn)有個(gè)主線程 子線程:主線程啟動(dòng)子線程 import threading,time def run():time.sleep(3):print('哈哈哈哈')start_time = time.time() threads=[] #存放啟動(dòng)的5個(gè)子線程 for i in range(5): t = threading.Thread(target=run) #實(shí)例化 t.start() #啟動(dòng)線程 threads.append(t) #啟動(dòng)后將子線程加入列表 for t in threads: #主線程循環(huán)等待5個(gè)子線程執(zhí)行結(jié)束 t.join() #循環(huán)等待,等所有線程執(zhí)行完畢后,再執(zhí)行下一句,即實(shí)現(xiàn)計(jì)算所有并發(fā)時(shí)間 end_time = time.time() print('run_time',end_time-start_time)運(yùn)行結(jié)果:并發(fā)時(shí)間:(這個(gè)時(shí)間是準(zhǔn)確的)
?
轉(zhuǎn)載于:https://www.cnblogs.com/fancyl/p/9101193.html
總結(jié)
以上是生活随笔為你收集整理的多线程threading初识,线程等待的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三剑客之sed常用操作
- 下一篇: 80端口被system(pid=4)占用