亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python多線程中阻塞(join)與鎖(Lock)使用誤區(qū)解析

 更新時間:2018年04月27日 09:59:59   作者:Xyntax  
這篇文章主要為大家詳細介紹了Python多線程中阻塞join與鎖Lock的使用誤區(qū),具有一定的參考價值,感興趣的小伙伴們可以參考一下

關(guān)于阻塞主線程

join的錯誤用法

Thread.join() 作用為阻塞主線程,即在子線程未返回的時候,主線程等待其返回然后再繼續(xù)執(zhí)行.

join不能與start在循環(huán)里連用
以下為錯誤代碼,代碼創(chuàng)建了5個線程,然后用一個循環(huán)激活線程,激活之后令其阻塞主線程.

threads = [Thread() for i in range(5)]
for thread in threads:
 thread.start()
 thread.join()

執(zhí)行過程:

1. 第一次循環(huán)中,主線程通過start函數(shù)激活線程1,線程1進行計算.
2. 由于start函數(shù)不阻塞主線程,在線程1進行運算的同時,主線程向下執(zhí)行join函數(shù).
3. 執(zhí)行join之后,主線程被線程1阻塞,在線程1返回結(jié)果之前,主線程無法執(zhí)行下一輪循環(huán).
4. 線程1計算完成之后,解除對主線程的阻塞.
5. 主線程進入下一輪循環(huán),激活線程2并被其阻塞…

如此往復,可以看出,本來應該并發(fā)的五個線程,在這里變成了順序隊列,效率和單線程無異.

join的正確用法

使用兩個循環(huán)分別處理startjoin函數(shù).即可實現(xiàn)并發(fā).

threads = [Thread() for i in range(5)]
for thread in threads:
 thread.start()
for thread in threads:
 thread.join()

time.sleep代替join進行調(diào)試

之前在一些項目里看到過這樣的代碼,使用time.sleep代替join手動阻塞主線程.
在所有子線程返回之前,主線程陷入無線循環(huán)而不能退出.

for thread in threads:
 thread.start()
while 1:
 if thread_num == 0:
 break
 time.sleep(0.01)

關(guān)于線程鎖(threading.Lock)

單核CPU+PIL是否還需要鎖?

非原子操作 count = count + 1 理論上是線程不安全的.
使用3個線程同時執(zhí)行上述操作改變?nèi)肿兞縞ount的值,并查看程序執(zhí)行結(jié)果.
如果結(jié)果正確,則表示未出現(xiàn)線程沖突.

使用以下代碼測試

# -*- coding: utf-8 -*-

import threading
import time
count = 0

class Counter(threading.Thread):
 def __init__(self, name):
 self.thread_name = name
 super(Counter, self).__init__(name=name)

 def run(self):
 global count
 for i in xrange(100000):
  count = count + 1


counters = [Counter('thread:%s' % i) for i in range(5)]
for counter in counters:
 counter.start()

time.sleep(5)
print 'count=%s' % count

運行結(jié)果:

count=275552

事實上每次運行結(jié)果都不相同且不正確,這證明單核CPU+PIL仍無法保證線程安全,需要加鎖.

加鎖后的正確代碼:

# -*- coding: utf-8 -*-

import threading
import time

count = 0
lock = threading.Lock()


class Counter(threading.Thread):
 def __init__(self, name):
 self.thread_name = name
 self.lock = threading.Lock()
 super(Counter, self).__init__(name=name)

 def run(self):
 global count
 global lock
 for i in xrange(100000):
  lock.acquire()
  count = count + 1
  lock.release()


counters = [Counter('thread:%s' % i) for i in range(5)]

for counter in counters:
 counter.start()

time.sleep(5)
print 'count=%s' % count

結(jié)果:

count=500000

注意鎖的全局性

這是一個簡單的Python語法問題,但在邏輯復雜時有可能被忽略.
要保證鎖對于多個子線程來說是共用的,即不要在Thread的子類內(nèi)部創(chuàng)建鎖.

以下為錯誤代碼

# -*- coding: utf-8 -*-

import threading
import time

count = 0
# lock = threading.Lock() # 正確的聲明位置

class Counter(threading.Thread):
 def __init__(self, name):
 self.thread_name = name
 self.lock = threading.Lock() # 錯誤的聲明位置
 super(Counter, self).__init__(name=name)

 def run(self):
 global count
 for i in xrange(100000):
  self.lock.acquire()
  count = count + 1
  self.lock.release()


counters = [Counter('thread:%s' % i) for i in range(5)]

for counter in counters:
 print counter.thread_name
 counter.start()

time.sleep(5)
print 'count=%s' % count

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python文件開頭聲明UTF-8編碼的幾種常用方式匯總

    python文件開頭聲明UTF-8編碼的幾種常用方式匯總

    這篇文章主要介紹了python文件開頭聲明UTF-8編碼的幾種常用方式匯總,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • python把ipynb文件轉(zhuǎn)換成pdf文件過程詳解

    python把ipynb文件轉(zhuǎn)換成pdf文件過程詳解

    這篇文章主要介紹了用python把ipynb文件轉(zhuǎn)換成pdf文件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python餐飲AI機器人學習數(shù)據(jù)網(wǎng)絡抓取

    Python餐飲AI機器人學習數(shù)據(jù)網(wǎng)絡抓取

    在餐飲行業(yè),AI機器人可以通過學習大量的相關(guān)數(shù)據(jù)來提供更好的服務和體驗,在文本中,我們將介紹如何使用python進行餐飲A?I機器人學習數(shù)據(jù)的網(wǎng)絡抓取,并提供代碼的示例和最佳實踐
    2023-12-12
  • tensorflow官方github預訓練模型下載方式

    tensorflow官方github預訓練模型下載方式

    這篇文章主要介紹了tensorflow官方github預訓練模型下載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 詳解Python實現(xiàn)字典合并的四種方法

    詳解Python實現(xiàn)字典合并的四種方法

    這篇文章主要為大家詳細介紹了Python的合并字典的四種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python實現(xiàn)中文文本關(guān)鍵詞抽取的三種方法

    Python實現(xiàn)中文文本關(guān)鍵詞抽取的三種方法

    文本關(guān)鍵詞抽取,是對文本信息進行高度凝練的一種有效手段,通過3-5個詞語準確概括文本的主題,幫助讀者快速理解文本信息,本文分別采用TF-IDF方法、TextRank方法和Word2Vec詞聚類方法,利用Python語言進行開發(fā),實現(xiàn)文本關(guān)鍵詞的抽取,需要的朋友可以參考下
    2024-01-01
  • python版本五子棋的實現(xiàn)代碼

    python版本五子棋的實現(xiàn)代碼

    五子棋是常見的一款小游戲,五子棋問題是人工智能中的一個經(jīng)典問題。這篇文章主要介紹了python版本五子棋的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Python實現(xiàn)二叉樹前序、中序、后序及層次遍歷示例代碼

    Python實現(xiàn)二叉樹前序、中序、后序及層次遍歷示例代碼

    這篇文章主要給大家介紹了關(guān)于Python實現(xiàn)二叉樹前序、中序、后序及層次遍歷的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • python實現(xiàn)爬蟲抓取小說功能示例【抓取金庸小說】

    python實現(xiàn)爬蟲抓取小說功能示例【抓取金庸小說】

    這篇文章主要介紹了python實現(xiàn)爬蟲抓取小說功能,結(jié)合具體實例形式分析了使用Python爬蟲抓取金庸小說的具體操作技巧,需要的朋友可以參考下
    2019-08-08
  • python?pyaudio音頻錄制的實現(xiàn)

    python?pyaudio音頻錄制的實現(xiàn)

    這篇文章主要介紹了python?pyaudio音頻錄制的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論