在計算機并發(fā)領域編程中總是會與鎖打交道,鎖又有很多種,互斥鎖、自旋鎖等等。
專注于為中小企業(yè)提供網(wǎng)站設計制作、做網(wǎng)站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)巫溪免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。鎖總是伴隨著線程、進程這樣的詞匯出現(xiàn),阮一峰有 一篇文章 對這些名詞進行了簡單易懂的解釋。
我的理解是,使用線程、進程是為了實現(xiàn)并發(fā)從而獲得性能的提升(利用多核CPU,多臺服務器),但這種并發(fā)由于調度的不確定性,很容易出亂子,為了(在一些共享資源、關鍵節(jié)點上)不出亂子,又需要對資源加鎖,在操作這個資源時控制這種并發(fā),將亂子消滅。
很多語言都提供了一些線程級別的鎖實現(xiàn)以及一些相應的工具,但在進程方面就無能為力了。而一個服務部署到生產(chǎn)環(huán)境,往往會部署多個實例,這種情況下,就經(jīng)常會用到給不同進程用的鎖,分布式鎖便是在分布式系統(tǒng)中對某共享資源進行加鎖的構件。
現(xiàn)在來試著展示一下在Python項目中如何使用簡單的分布式互斥鎖。
不使用分布式鎖會怎樣
先用一個簡單的實例來演示一下,不使用分布式鎖會出怎樣的亂子。
假設商城系統(tǒng)要做秒殺活動,在redis中記錄著 count:1 的信息,到秒殺時間點的時候,會收到許多的請求,這時各應用程序去查redis中count的值,若count還大于0,則將count-1,這樣其他請求就不再能秒殺到了。
# -*- coding: utf-8 -*- import os import arrow import redis from multiprocessing import Pool HOT_KEY = 'count' r = redis.Redis(host='localhost', port=6379) def seckilling(): name = os.getpid() v = r.get(HOT_KEY) if int(v) > 0: print name, ' decr redis.' r.decr(HOT_KEY) else: print name, ' can not set redis.', v def run_without_lock(name): while True: if arrow.now().second % 5 == 0: seckilling() return if __name__ == '__main__': p = Pool(16) r.set(HOT_KEY, 1) for i in range(16): p.apply_async(run_without_lock, args=(i, )) print 'now 16 processes are going to get lock!' p.close() p.join() print('All subprocesses done.')
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。