婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python多線程超詳細詳解

python多線程超詳細詳解

熱門標簽:佛山通用400電話申請 打印谷歌地圖標注 電話外呼系統招商代理 蘇州人工外呼系統軟件 京華圖書館地圖標注 電話機器人貸款詐騙 淮安呼叫中心外呼系統如何 廣東旅游地圖標注 看懂地圖標注方法

python中的多線程是一個非常重要的知識點,今天為大家對多線程進行詳細的說明,代碼中的注釋有多線程的知識點還有測試用的實例。

import threading
from threading import Lock,Thread
import time,os


'''
          python多線程詳解
  什么是線程?
  線程也叫輕量級進程,是操作系統能夠進行運算調度的最小單位,它被包涵在進程之中,是進程中的實際運作單位。
  線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所
  擁有的全部資源。一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以并發執行
'''

'''
 為什么要使用多線程?
 線程在程序中是獨立的、并發的執行流。與分隔的進程相比,進程中線程之間的隔離程度要小,它們共享內存、文件句柄
 和其他進程應有的狀態。
 因為線程的劃分尺度小于進程,使得多線程程序的并發性高。進程在執行過程之中擁有獨立的內存單元,而多個線程共享
 內存,從而極大的提升了程序的運行效率。
 線程比進程具有更高的性能,這是由于同一個進程中的線程都有共性,多個線程共享一個進程的虛擬空間。線程的共享環境
 包括進程代碼段、進程的共有數據等,利用這些共享的數據,線程之間很容易實現通信。
 操作系統在創建進程時,必須為改進程分配獨立的內存空間,并分配大量的相關資源,但創建線程則簡單得多。因此,使用多線程
 來實現并發比使用多進程的性能高得要多。
'''

'''
 總結起來,使用多線程編程具有如下幾個優點:
 進程之間不能共享內存,但線程之間共享內存非常容易。
 操作系統在創建進程時,需要為該進程重新分配系統資源,但創建線程的代價則小得多。因此使用多線程來實現多任務并發執行比使用多進程的效率高
 python語言內置了多線程功能支持,而不是單純地作為底層操作系統的調度方式,從而簡化了python的多線程編程。
'''


'''
 普通創建方式
'''
# def run(n):
#  print('task',n)
#  time.sleep(1)
#  print('2s')
#  time.sleep(1)
#  print('1s')
#  time.sleep(1)
#  print('0s')
#  time.sleep(1)
#
# if __name__ == '__main__':
#  t1 = threading.Thread(target=run,args=('t1',))  # target是要執行的函數名(不是函數),args是函數對應的參數,以元組的形式存在
#  t2 = threading.Thread(target=run,args=('t2',))
#  t1.start()
#  t2.start()


'''
 自定義線程:繼承threading.Thread來定義線程類,其本質是重構Thread類中的run方法
'''
# class MyThread(threading.Thread):
#  def __init__(self,n):
#   super(MyThread,self).__init__() #重構run函數必須寫
#   self.n = n
#
#  def run(self):
#   print('task',self.n)
#   time.sleep(1)
#   print('2s')
#   time.sleep(1)
#   print('1s')
#   time.sleep(1)
#   print('0s')
#   time.sleep(1)
#
# if __name__ == '__main__':
#  t1 = MyThread('t1')
#  t2 = MyThread('t2')
#  t1.start()
#  t2.start()


'''
 守護線程
 下面這個例子,這里使用setDaemon(True)把所有的子線程都變成了主線程的守護線程,
 因此當主線程結束后,子線程也會隨之結束,所以當主線程結束后,整個程序就退出了。
 所謂'線程守護',就是主線程不管該線程的執行情況,只要是其他子線程結束且主線程執行完畢,主線程都會關閉。也就是說:主線程不等待該守護線程的執行完再去關閉。
'''
# def run(n):
#  print('task',n)
#  time.sleep(1)
#  print('3s')
#  time.sleep(1)
#  print('2s')
#  time.sleep(1)
#  print('1s')
#
# if __name__ == '__main__':
#  t=threading.Thread(target=run,args=('t1',))
#  t.setDaemon(True)
#  t.start()
#  print('end')
'''
 通過執行結果可以看出,設置守護線程之后,當主線程結束時,子線程也將立即結束,不再執行
'''

'''
 主線程等待子線程結束
 為了讓守護線程執行結束之后,主線程再結束,我們可以使用join方法,讓主線程等待子線程執行
'''
# def run(n):
#  print('task',n)
#  time.sleep(2)
#  print('5s')
#  time.sleep(2)
#  print('3s')
#  time.sleep(2)
#  print('1s')
# if __name__ == '__main__':
#  t=threading.Thread(target=run,args=('t1',))
#  t.setDaemon(True) #把子線程設置為守護線程,必須在start()之前設置
#  t.start()
#  t.join()  #設置主線程等待子線程結束
#  print('end')


'''
 多線程共享全局變量
 線程時進程的執行單元,進程時系統分配資源的最小執行單位,所以在同一個進程中的多線程是共享資源的
'''
# g_num = 100
# def work1():
#  global g_num
#  for i in range(3):
#   g_num+=1
#  print('in work1 g_num is : %d' % g_num)
#
# def work2():
#  global g_num
#  print('in work2 g_num is : %d' % g_num)
#
# if __name__ == '__main__':
#  t1 = threading.Thread(target=work1)
#  t1.start()
#  time.sleep(1)
#  t2=threading.Thread(target=work2)
#  t2.start()


'''
  由于線程之間是進行隨機調度,并且每個線程可能只執行n條執行之后,當多個線程同時修改同一條數據時可能會出現臟數據,
 所以出現了線程鎖,即同一時刻允許一個線程執行操作。線程鎖用于鎖定資源,可以定義多個鎖,像下面的代碼,當需要獨占
 某一個資源時,任何一個鎖都可以鎖定這個資源,就好比你用不同的鎖都可以把這個相同的門鎖住一樣。
  由于線程之間是進行隨機調度的,如果有多個線程同時操作一個對象,如果沒有很好地保護該對象,會造成程序結果的不可預期,
 我們因此也稱為“線程不安全”。
  為了防止上面情況的發生,就出現了互斥鎖(Lock)
'''
# def work():
#  global n
#  lock.acquire()
#  temp = n
#  time.sleep(0.1)
#  n = temp-1
#  lock.release()
#
#
# if __name__ == '__main__':
#  lock = Lock()
#  n = 100
#  l = []
#  for i in range(100):
#   p = Thread(target=work)
#   l.append(p)
#   p.start()
#  for p in l:
#   p.join()


'''
 遞歸鎖:RLcok類的用法和Lock類一模一樣,但它支持嵌套,在多個鎖沒有釋放的時候一般會使用RLock類
'''
# def func(lock):
#  global gl_num
#  lock.acquire()
#  gl_num += 1
#  time.sleep(1)
#  print(gl_num)
#  lock.release()
#
#
# if __name__ == '__main__':
#  gl_num = 0
#  lock = threading.RLock()
#  for i in range(10):
#   t = threading.Thread(target=func,args=(lock,))
#   t.start()


'''
 信號量(BoundedSemaphore類)
 互斥鎖同時只允許一個線程更改數據,而Semaphore是同時允許一定數量的線程更改數據,比如廁所有3個坑,
 那最多只允許3個人上廁所,后面的人只能等里面有人出來了才能再進去
'''
# def run(n,semaphore):
#  semaphore.acquire() #加鎖
#  time.sleep(3)
#  print('run the thread:%s\n' % n)
#  semaphore.release() #釋放
#
#
# if __name__== '__main__':
#  num=0
#  semaphore = threading.BoundedSemaphore(5) #最多允許5個線程同時運行
#  for i in range(22):
#   t = threading.Thread(target=run,args=('t-%s' % i,semaphore))
#   t.start()
#  while threading.active_count() !=1:
#   pass
#  else:
#   print('----------all threads done-----------')

'''
 python線程的事件用于主線程控制其他線程的執行,事件是一個簡單的線程同步對象,其主要提供以下的幾個方法:
  clear將flag設置為 False
  set將flag設置為 True
  is_set判斷是否設置了flag
  wait會一直監聽flag,如果沒有檢測到flag就一直處于阻塞狀態
 事件處理的機制:全局定義了一個Flag,當Flag的值為False,那么event.wait()就會阻塞,當flag值為True,
 那么event.wait()便不再阻塞
'''
event = threading.Event()
def lighter():
 count = 0
 event.set()   #初始者為綠燈
 while True:
  if 5  count =10:
   event.clear() #紅燈,清除標志位
   print("\33[41;lmred light is on...\033[0m]")
  elif count > 10:
   event.set() #綠燈,設置標志位
   count = 0
  else:
   print('\33[42;lmgreen light is on...\033[0m')

  time.sleep(1)
  count += 1


def car(name):
 while True:
  if event.is_set():  #判斷是否設置了標志位
   print('[%s] running.....'%name)
   time.sleep(1)
  else:
   print('[%s] sees red light,waiting...'%name)
   event.wait()
   print('[%s] green light is on,start going...'%name)


# startTime = time.time()
light = threading.Thread(target=lighter,)
light.start()

car = threading.Thread(target=car,args=('MINT',))
car.start()
endTime = time.time()
# print('用時:',endTime-startTime)

'''
       GIL 全局解釋器
  在非python環境中,單核情況下,同時只能有一個任務執行。多核時可以支持多個線程同時執行。但是在python中,無論有多少個核
  同時只能執行一個線程。究其原因,這就是由于GIL的存在導致的。
  GIL的全程是全局解釋器,來源是python設計之初的考慮,為了數據安全所做的決定。某個線程想要執行,必須先拿到GIL,我們可以
  把GIL看做是“通行證”,并且在一個python進程之中,GIL只有一個。拿不到線程的通行證,并且在一個python進程中,GIL只有一個,
  拿不到通行證的線程,就不允許進入CPU執行。GIL只在cpython中才有,因為cpython調用的是c語言的原生線程,所以他不能直接操
  作cpu,而只能利用GIL保證同一時間只能有一個線程拿到數據。而在pypy和jpython中是沒有GIL的
  python在使用多線程的時候,調用的是c語言的原生過程。
'''
'''
       python針對不同類型的代碼執行效率也是不同的
  1、CPU密集型代碼(各種循環處理、計算等),在這種情況下,由于計算工作多,ticks技術很快就會達到閥值,然后出發GIL的
  釋放與再競爭(多個線程來回切換當然是需要消耗資源的),所以python下的多線程對CPU密集型代碼并不友好。
  2、IO密集型代碼(文件處理、網絡爬蟲等設計文件讀寫操作),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,
  造成不必要的時間浪費,而開啟多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序的執行
  效率)。所以python的多線程對IO密集型代碼比較友好。
'''
'''
 主要要看任務的類型,我們把任務分為I/O密集型和計算密集型,而多線程在切換中又分為I/O切換和時間切換。如果任務屬于是I/O密集型,
 若不采用多線程,我們在進行I/O操作時,勢必要等待前面一個I/O任務完成后面的I/O任務才能進行,在這個等待的過程中,CPU處于等待
 狀態,這時如果采用多線程的話,剛好可以切換到進行另一個I/O任務。這樣就剛好可以充分利用CPU避免CPU處于閑置狀態,提高效率。但是
 如果多線程任務都是計算型,CPU會一直在進行工作,直到一定的時間后采取多線程時間切換的方式進行切換線程,此時CPU一直處于工作狀態,
 此種情況下并不能提高性能,相反在切換多線程任務時,可能還會造成時間和資源的浪費,導致效能下降。這就是造成上面兩種多線程結果不能的解釋。
結論:I/O密集型任務,建議采取多線程,還可以采用多進程+協程的方式(例如:爬蟲多采用多線程處理爬取的數據);對于計算密集型任務,python此時就不適用了。
'''

到此這篇關于python多線程超詳細詳解的文章就介紹到這了,更多相關python多線程內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深入理解python多線程編程
  • python基于concurrent模塊實現多線程
  • Python 多線程之threading 模塊的使用
  • python 如何用map()函數創建多線程任務
  • python 多進程和多線程使用詳解
  • Python多進程與多線程的使用場景詳解
  • Python之多進程與多線程的使用
  • python 多線程爬取壁紙網站的示例
  • python 實現多線程的三種方法總結

標簽:江蘇 畢節 中山 衡水 駐馬店 湖州 股票 呼和浩特

巨人網絡通訊聲明:本文標題《python多線程超詳細詳解》,本文關鍵詞  python,多,線程,超,詳細,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python多線程超詳細詳解》相關的同類信息!
  • 本頁收集關于python多線程超詳細詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区在线看| 国产精品精品国产色婷婷| 狠狠色狠狠色综合系列| 91精品综合久久久久久| 大胆欧美人体老妇| 免费日韩伦理电影| 欧美老肥妇做.爰bbww视频| 国产乱淫av一区二区三区| 欧美国产国产综合| 精品久久久久久最新网址| 一区二区三区中文字幕| 中文字幕不卡三区| 日韩视频一区二区| 久久99日本精品| 精品午夜一区二区三区在线观看| 国产精品每日更新在线播放网址 | 日韩国产成人精品| 麻豆精品在线观看| av一区二区三区| 国产中文一区二区三区| 亚洲午夜私人影院| 午夜精品一区二区三区免费视频| 亚洲一区二区偷拍精品| 久久亚洲综合av| 国产精品久久久久影院亚瑟| 91丨porny丨首页| 亚洲乱码中文字幕| 亚洲精品日韩一| 久久精品视频在线免费观看| 亚洲资源中文字幕| 久久99精品久久久久久国产越南| 国产一区二区剧情av在线| 91视频免费看| 欧美日韩在线观看一区二区| 欧美一级片免费看| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美亚洲一区二区三区四区| 91.麻豆视频| 亚洲精品一二三区| 一区二区高清视频在线观看| 欧美成人精精品一区二区频| 亚洲少妇30p| 国产在线精品免费| 欧美日韩视频不卡| 成人av在线影院| 欧美一级艳片视频免费观看| 一区二区三区在线看| jizz一区二区| 中文字幕一区二区5566日韩| www.色综合.com| 国产在线精品视频| 国产日韩在线不卡| 成人网在线播放| 久久久久久综合| 三级不卡在线观看| 波多野结衣在线一区| 国产欧美日韩亚州综合| gogo大胆日本视频一区| 久久综合精品国产一区二区三区| 久久激情综合网| 一区二区三区精品视频在线| 91精品福利在线一区二区三区 | 欧美日韩国产123区| 国产在线播放一区三区四| 久久久五月婷婷| 欧美一区二区在线看| 狠狠色丁香婷婷综合久久片| 亚洲精品国产精华液| 精品久久一区二区| 欧美性色黄大片| 波多野结衣欧美| 石原莉奈在线亚洲三区| 日韩一区有码在线| 日韩一区在线播放| 国产精品久久久久天堂| 日韩欧美的一区| 7777精品伊人久久久大香线蕉| 一本色道综合亚洲| 91婷婷韩国欧美一区二区| 国产91丝袜在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲国产成人精品视频| 亚洲天堂网中文字| 亚洲视频在线一区观看| 一区二区三区四区av| 中文字幕日本不卡| 一区二区三区四区高清精品免费观看| 国产日韩欧美综合在线| 国产蜜臀av在线一区二区三区| 国产夜色精品一区二区av| 久久久国产精品麻豆| 久久久久久综合| 亚洲免费视频中文字幕| 日韩av电影一区| 国产成人av一区| 丰满亚洲少妇av| 欧美三级在线看| 国产欧美日韩精品a在线观看| 亚洲欧洲三级电影| 91在线云播放| 欧美日韩在线播放一区| 精品国产91久久久久久久妲己| 国产精品久久久久久久久晋中 | wwwwww.欧美系列| 日韩美女视频一区| 成人自拍视频在线观看| 宅男噜噜噜66一区二区66| 国产精品美女久久久久久久久 | 欧美日韩mp4| 亚洲色欲色欲www| 国产精品18久久久久久久久 | 精品视频1区2区| 欧美激情一区二区三区不卡| 午夜精品在线看| 日韩av一区二| 欧美探花视频资源| 亚洲精选在线视频| 91丨九色丨蝌蚪丨老版| 国产精品美女视频| 国产.欧美.日韩| 国产欧美1区2区3区| 韩国成人福利片在线播放| 91麻豆免费在线观看| 中文字幕亚洲成人| 91免费视频观看| 依依成人精品视频| 久久久精品黄色| 在线影院国内精品| 亚洲chinese男男1069| 欧美色图12p| 婷婷一区二区三区| 欧美一区二区三区精品| 国产久卡久卡久卡久卡视频精品| 精品久久久久久最新网址| 亚洲第一狼人社区| 日韩欧美色电影| 国产凹凸在线观看一区二区| 国产精品每日更新在线播放网址| 成人av免费在线| 亚洲男人的天堂在线观看| 色先锋久久av资源部| 麻豆精品一区二区av白丝在线| 一卡二卡欧美日韩| 日韩欧美一级二级三级久久久| 美女一区二区久久| 亚洲精品大片www| 久久影院视频免费| 日本一区二区久久| 丝袜美腿一区二区三区| 99久久er热在这里只有精品15| 亚洲综合清纯丝袜自拍| 日本aⅴ免费视频一区二区三区| 奇米四色…亚洲| 成人免费毛片高清视频| 91在线国产福利| 色欧美片视频在线观看| 精品一区二区三区久久| 麻豆一区二区在线| 久久国产精品一区二区| 奇米影视一区二区三区小说| 午夜欧美2019年伦理| 日韩和的一区二区| 一区二区三区高清在线| 亚洲一级二级在线| 亚洲国产精品人人做人人爽| 亚洲一区欧美一区| 激情成人综合网| 99久精品国产| 日韩一区二区免费在线电影| 国产亚洲欧美一区在线观看| 亚洲欧美日韩一区二区三区在线观看 | 欧美三电影在线| 欧美成人性战久久| 欧美精品一区在线观看| 欧美一区二区三区免费观看视频 | 国产欧美日韩在线观看| 一卡二卡三卡日韩欧美| 成人av电影在线| 久久久国产午夜精品| 青青草国产成人99久久| 国产 欧美在线| 欧美精品丝袜中出| 国产精品麻豆99久久久久久| 亚洲大型综合色站| 国产精品一级片在线观看| 91成人免费在线视频| 国产日本欧美一区二区| 奇米四色…亚洲| 成人禁用看黄a在线| av在线不卡观看免费观看| 欧美剧情电影在线观看完整版免费励志电影 | 日韩精品最新网址| 一区二区三区在线免费视频| 国产永久精品大片wwwapp| 日韩精品成人一区二区三区| 国产女人aaa级久久久级| 欧美视频日韩视频| 一区二区在线免费观看| 欧洲色大大久久| 捆绑调教美女网站视频一区|