最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 多線程的實例詳解

 更新時間:2017年09月07日 15:34:48   作者:攻城獅--晴明  
這篇文章主要介紹了 Python 多線程的實例詳解的相關(guān)資料,希望通過本文大家能掌握多線程的知識,需要的朋友可以參考下

 Python 多線程的實例詳解

一)線程基礎(chǔ)

1、創(chuàng)建線程:

thread模塊提供了start_new_thread函數(shù),用以創(chuàng)建線程。start_new_thread函數(shù)成功創(chuàng)建后還可以對其進(jìn)行操作。
其函數(shù)原型:

  start_new_thread(function,atgs[,kwargs])

其參數(shù)含義如下:

    function: 在線程中執(zhí)行的函數(shù)名
    args:元組形式的參數(shù)列表。
    kwargs: 可選參數(shù),以字典的形式指定參數(shù)

方法一:通過使用thread模塊中的函數(shù)創(chuàng)建新線程。

>>> import thread 
>>> def run(n): 
  for i in range(n): 
    print i 
 
     
>>> thread.start_new_thread(run,(4,))  #注意第二個參數(shù)一定要是元組的形式 
53840 
 
 
1 
>>>  
2 
3 
KeyboardInterrupt 
>>> thread.start_new_thread(run,(2,)) 
17840 
 
 
1 
>>>  
thread.start_new_thread(run,(),{'n':4}) 
39720 
 
 
1 
>>>  
2 
3 
thread.start_new_thread(run,(),{'n':3}) 
32480 
 
 
1 
>>>  
2 

方法二:通過繼承threading.Thread創(chuàng)建線程

>>> import threading 
>>> class mythread(threading.Thread): 
  def __init__(self,num): 
    threading.Thread.__init__(self) 
    self.num = num 
  def run(self):        #重載run方法 
    print 'I am', self.num 
 
     
>>> t1 = mythread(1) 
>>> t2 = mythread(2) 
>>> t3 = mythread(3) 
>>> t1.start()      #運(yùn)行線程t1 
I am 
>>> 1 
t2.start() 
I am 
>>> 2 
t3.start() 
I am 
>>> 3 

方法三:使用threading.Thread直接在線程中運(yùn)行函數(shù)。

import threading 
>>> def run(x,y): 
  for i in range(x,y): 
    print i 
 
>>> t1 = threading.Thread(target=run,args=(15,20)) #直接使用Thread附加函數(shù)args為函數(shù)參數(shù) 
 
>>> t1.start() 
15 
>>>  
16 
17 
18 
19 

二)Thread對象中的常用方法:

1、isAlive方法:

>>> import threading 
>>> import time 
>>> class mythread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
    self.id = id 
  def run(self): 
    time.sleep(5)  #休眠5秒 
    print self.id 
 
     
>>> t = mythread(1) 
>>> def func(): 
  t.start() 
  print t.isAlive()  #打印線程狀態(tài) 
 
   
>>> func() 
True 
>>> 1 

2、join方法:

原型:join([timeout]) 

    timeout: 可選參數(shù),線程運(yùn)行的最長時間

import threading 
>>> import time   #導(dǎo)入time模塊 
>>> class Mythread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
    self.id = id 
  def run(self): 
    x = 0 
    time.sleep(20) 
    print self.id 
 
     
>>> def func(): 
  t.start() 
  for i in range(5): 
    print i 
 
     
>>> t = Mythread(2) 
>>> func() 
0 
1 
2 
3 
4 
>>> 2 
def func(): 
  t.start() 
  t.join() 
  for i in range(5): 
    print i 
 
     
>>> t = Mythread(3) 
>>> func() 
3 
0 
1 
2 
3 
4 
>>>  

3、線程名:

>>> import threading 
>>> class mythread(threading.Thread): 
  def __init__(self,threadname): 
    threading.Thread.__init__(self,name=threadname) 
  def run(self): 
    print self.getName() 
 
     
>>>  
>>> t1 = mythread('t1') 
>>> t1.start() 
t1 
>>>  

 4、setDaemon方法

在腳本運(yùn)行的過程中有一個主線程,如果主線程又創(chuàng)建了一個子線程,那么當(dāng)主線程退出時,會檢驗子線程是否完成。如果子線程未完成,則主線程會在等待子線程完成后退出。

當(dāng)需要主線程退出時,不管子線程是否完成都隨主線程退出,則可以使用Thread對象的setDaemon方法來設(shè)置。 

三)線程同步

1.簡單的線程同步

使用Thread對象的Lock和RLock可以實現(xiàn)簡單的線程同步。對于如果需要每次只有一個線程操作的數(shù)據(jù),可以將操作過程放在acquire方法和release方法之間。如: 

# -*- coding:utf-8 -*- 
import threading 
import time 
class mythread(threading.Thread): 
  def __init__(self,threadname): 
    threading.Thread.__init__(self,name = threadname) 
  def run(self): 
    global x        #設(shè)置全局變量 
#    lock.acquire()     #調(diào)用lock的acquire方法 
    for i in range(3): 
      x = x + 1 
    time.sleep(2) 
    print x 
#    lock.release()     #調(diào)用lock的release方法 
#lock = threading.RLock()    #生成Rlock對象 
t1 = [] 
for i in range(10): 
  t = mythread(str(i)) 
  t1.append(t) 
x = 0          #將全局變量的值設(shè)為0 
for i in t1:  
  i.start() 
 
E:/study/<a  rel="external nofollow" class='replace_word' title="Python知識庫" target='_blank' style='color:#df3434; font-weight:bold;'>Python</a>/workspace>xianchengtongbu.py 
3 
6 
9 
12 
15 
18 
21 
24 
27 
30 

如果將lock.acquire()和lock.release(),lock = threading.Lock()刪除后保存運(yùn)行腳本,結(jié)果將是輸出10個30。30是x的最終值,由于x是全局變量,每個線程對其操作后進(jìn)入休眠狀態(tài),在線程休眠的時候,Python解釋器就執(zhí)行了其他的線程而是x的值增加。當(dāng)所有線程休眠結(jié)束后,x的值已被所有線修改為了30,因此輸出全部為30。 

2、使用條件變量保持線程同步。

python的Condition對象提供了對復(fù)制線程同步的支持。使用Condition對象可以在某些事件觸發(fā)后才處理數(shù)據(jù)。Condition對象除了具有acquire方法和release的方法外,還有wait方法、notify方法、notifyAll方法等用于條件處理。

# -*- coding:utf-8 -*- 
import threading 
class Producer(threading.Thread): 
  def __init__(self,threadname): 
    threading.Thread.__init__(self,name = threadname) 
  def run(self): 
    global x 
    con.acquire() 
    if x == 1000000: 
      con.wait() 
    #  pass 
    else: 
      for i in range(1000000): 
        x = x + 1 
      con.notify() 
    print x 
    con.release() 
class Consumer(threading.Thread): 
  def __init__(self,threadname): 
    threading.Thread.__init__(self,name = threadname) 
  def run(self): 
    global x  
    con.acquire() 
    if x == 0: 
      con.wait() 
      #pass 
    else: 
      for i in range(1000000): 
        x = x - 1 
      con.notify() 
    print x  
    con.release() 
con = threading.Condition() 
x = 0 
p = Producer('Producer') 
c = Consumer('Consumer') 
p.start() 
c.start() 
p.join() 
c.join() 
print x 
 
E:/study/python/workspace>xianchengtongbu2.py 
1000000 
0 
0 

線程間通信:

Event對象用于線程間的相互通信。他提供了設(shè)置信號、清除信宏、等待等用于實現(xiàn)線程間的通信。

1、設(shè)置信號。Event對象使用了set()方法后,isSet()方法返回真。
2、清除信號。使用Event對象的clear()方法后,isSet()方法返回為假。
3、等待。當(dāng)Event對象的內(nèi)部信號標(biāo)志為假時,則wait()方法一直等到其為真時才返回。還可以向wait傳遞參數(shù),設(shè)定最長的等待時間。

# -*- coding:utf-8 -*- 
import threading 
class mythread(threading.Thread): 
  def __init__(self,threadname): 
    threading.Thread.__init__(self,name = threadname) 
  def run(self): 
    global event 
    if event.isSet(): 
      event.clear() 
      event.wait()  #當(dāng)event被標(biāo)記時才返回 
      print self.getName() 
    else: 
      print self.getName() 
      event.set() 
event = threading.Event() 
event.set() 
t1 = [] 
for i in range(10): 
  t = mythread(str(i)) 
  t1.append(t) 
for i in t1: 
  i.start() 

如有疑問請留言或者到本站社區(qū)交流討論,感謝 閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • pytorch保存和加載模型的方法及如何load部分參數(shù)

    pytorch保存和加載模型的方法及如何load部分參數(shù)

    本文總結(jié)了pytorch中保存和加載模型的方法,以及在保存的模型文件與新定義的模型的參數(shù)不一一對應(yīng)時,我們該如何加載模型參數(shù),對pytorch保存和加載模型相關(guān)知識感興趣的朋友一起看看吧
    2024-03-03
  • Python中format格式化的用法及說明

    Python中format格式化的用法及說明

    這篇文章主要介紹了Python中format格式化的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python中的Pandas?時間函數(shù)?time?、datetime?模塊和時間處理基礎(chǔ)講解

    Python中的Pandas?時間函數(shù)?time?、datetime?模塊和時間處理基礎(chǔ)講解

    Python?中提供了對時間日期的多種多樣的處理方式,主要是在?time?和?datetime?這兩個模塊里,這篇文章主要介紹了Python中的Pandas?時間函數(shù)?time?、datetime?模塊和時間處理基礎(chǔ),需要的朋友可以參考下
    2023-03-03
  • pandas如何處理缺失值

    pandas如何處理缺失值

    這篇文章主要介紹了pandas如何處理缺失值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python+opencv邊緣提取與各函數(shù)參數(shù)解析

    python+opencv邊緣提取與各函數(shù)參數(shù)解析

    這篇文章主要介紹了python+opencv邊緣提取與各函數(shù)參數(shù)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python實現(xiàn)TCP服務(wù)器端與客戶端的方法詳解

    python實現(xiàn)TCP服務(wù)器端與客戶端的方法詳解

    這篇文章主要介紹了python實現(xiàn)TCP服務(wù)器端與客戶端的方法,以實例形式詳解分析了Python實現(xiàn)服務(wù)器端與客戶端的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 使用Flask-Login模塊實現(xiàn)用戶身份驗證和安全性

    使用Flask-Login模塊實現(xiàn)用戶身份驗證和安全性

    當(dāng)你想要在你的Flask應(yīng)用中實現(xiàn)用戶身份驗證和安全性時,F(xiàn)lask-Login這個擴(kuò)展將會是你的最佳伙伴,它提供了一組簡單而強(qiáng)大的工具來處理,下面我們就來看看具體的操作方法吧
    2023-08-08
  • 給keras層命名,并提取中間層輸出值,保存到文檔的實例

    給keras層命名,并提取中間層輸出值,保存到文檔的實例

    這篇文章主要介紹了給keras層命名,并提取中間層輸出值,保存到文檔的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python繪制心形曲線完整代碼實現(xiàn)

    Python繪制心形曲線完整代碼實現(xiàn)

    這篇文章主要介紹了Python繪制心形曲線的相關(guān)資料,通過numpy和matplotlib庫計算坐標(biāo)并繪圖,代碼包含導(dǎo)入庫、定義函數(shù)、生成參數(shù)、計算坐標(biāo)、繪圖和顯示圖形等步驟,展示了數(shù)學(xué)與編程的結(jié)合美感,需要的朋友可以參考下
    2024-10-10
  • Python入門教程之if語句的用法

    Python入門教程之if語句的用法

    這篇文章主要介紹了Python入門教程之if語句的用法,是Python入門的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論

鄂尔多斯市| 柳州市| 乐清市| 凯里市| 喀什市| 新宾| 河北省| 通州市| 图片| 梁山县| 衢州市| 黄大仙区| 青海省| 和静县| 金溪县| 芦山县| 拉萨市| 乌拉特前旗| 威海市| 工布江达县| 礼泉县| 翼城县| 大同县| 克什克腾旗| 淮安市| 宁德市| 新化县| 财经| 上杭县| 长乐市| 阿克| 上蔡县| 婺源县| 稷山县| 朝阳区| 富蕴县| 揭阳市| 黔江区| 湟中县| 崇阳县| 五大连池市|