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

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

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

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

join的錯(cuò)誤用法

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

join不能與start在循環(huán)里連用
以下為錯(cuò)誤代碼,代碼創(chuàng)建了5個(gè)線程,然后用一個(gè)循環(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進(jìn)行計(jì)算.
2. 由于start函數(shù)不阻塞主線程,在線程1進(jìn)行運(yùn)算的同時(shí),主線程向下執(zhí)行join函數(shù).
3. 執(zhí)行join之后,主線程被線程1阻塞,在線程1返回結(jié)果之前,主線程無法執(zhí)行下一輪循環(huán).
4. 線程1計(jì)算完成之后,解除對主線程的阻塞.
5. 主線程進(jìn)入下一輪循環(huán),激活線程2并被其阻塞…

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

join的正確用法

使用兩個(gè)循環(huán)分別處理startjoin函數(shù).即可實(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進(jìn)行調(diào)試

之前在一些項(xiàng)目里看到過這樣的代碼,使用time.sleep代替join手動(dòng)阻塞主線程.
在所有子線程返回之前,主線程陷入無線循環(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個(gè)線程同時(shí)執(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

運(yùn)行結(jié)果:

count=275552

事實(shí)上每次運(yùn)行結(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

注意鎖的全局性

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

以下為錯(cuò)誤代碼

# -*- 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() # 錯(cuò)誤的聲明位置
 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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談python import引入不同路徑下的模塊

    淺談python import引入不同路徑下的模塊

    下面小編就為大家?guī)硪黄獪\談python import引入不同路徑下的模塊。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • python使用Matplotlib繪制分段函數(shù)

    python使用Matplotlib繪制分段函數(shù)

    這篇文章主要為大家詳細(xì)介紹了python使用Matplotlib繪制分段函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python動(dòng)態(tài)進(jìn)度條的實(shí)現(xiàn)代碼

    python動(dòng)態(tài)進(jìn)度條的實(shí)現(xiàn)代碼

    有時(shí)候我們需要使用print打印工作進(jìn)度,正常使用print函數(shù)會(huì)導(dǎo)致刷屏的現(xiàn)象,本文通過實(shí)例代碼給大家介紹python動(dòng)態(tài)進(jìn)度條的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • 基于Django用戶認(rèn)證系統(tǒng)詳解

    基于Django用戶認(rèn)證系統(tǒng)詳解

    下面小編就為大家分享一篇基于Django用戶認(rèn)證系統(tǒng)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • JPype實(shí)現(xiàn)在python中調(diào)用JAVA的實(shí)例

    JPype實(shí)現(xiàn)在python中調(diào)用JAVA的實(shí)例

    本篇文章主要介紹了JPype實(shí)現(xiàn)在python中調(diào)用JAVA的實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 解決Cron定時(shí)任務(wù)中Pytest腳本無法發(fā)送郵件的問題

    解決Cron定時(shí)任務(wù)中Pytest腳本無法發(fā)送郵件的問題

    文章探討解決在 Cron 定時(shí)任務(wù)中運(yùn)行 Pytest 腳本時(shí)郵件發(fā)送失敗的問題,先優(yōu)化環(huán)境變量,再檢查 Pytest 郵件配置,接著配置文件確保 SMTP 服務(wù)正常,包括編輯相關(guān)文件、配置認(rèn)證信息等,還提及常見問題排查,如防火墻等,最終使郵件功能在定時(shí)任務(wù)中成功運(yùn)行
    2025-01-01
  • python 二維數(shù)組90度旋轉(zhuǎn)的方法

    python 二維數(shù)組90度旋轉(zhuǎn)的方法

    今天小編就為大家分享一篇python 二維數(shù)組90度旋轉(zhuǎn)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python中opencv?直方圖處理

    python中opencv?直方圖處理

    這篇文章主要介紹了python中opencv?直方圖處理,直方圖從圖像內(nèi)部灰度級(jí)的角度對圖像進(jìn)行表述,直方圖是圖像內(nèi)灰度值的統(tǒng)計(jì)特性與圖像灰度值之間的函數(shù),直方圖統(tǒng)計(jì)圖像內(nèi)各個(gè)灰度級(jí)出現(xiàn)的次數(shù),更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • Python中常用的8種字符串操作方法

    Python中常用的8種字符串操作方法

    這篇文章主要介紹了Python中常用的8種字符串操作方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • python如何寫個(gè)俄羅斯方塊

    python如何寫個(gè)俄羅斯方塊

    這篇文章主要介紹了python寫個(gè)俄羅斯方塊,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11

最新評論

白玉县| 香港| 文昌市| 渭源县| 泰宁县| 枣强县| 佛山市| 延边| 鄂托克旗| 宜川县| 纳雍县| 大关县| 林口县| 萨迦县| 尚志市| 安丘市| 修文县| 新田县| 宁津县| 个旧市| 上高县| 湖北省| 肥西县| 怀宁县| 临沧市| 苏尼特左旗| 鹰潭市| 马龙县| 安吉县| 宾川县| 沙河市| 延寿县| 沙田区| 和顺县| 怀集县| 唐山市| 平邑县| 海南省| 库尔勒市| 长岭县| 慈溪市|