日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多线程threading初识,线程等待

發(fā)布時(shí)間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程threading初识,线程等待 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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) #干活需要3s
print('哈哈哈')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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。