并發(fā)編程—創(chuàng)建多線程的三種方式

#!/usr/local/bin/python3
"""
多線程程序如果沒有競爭資源的場景那么通常會比較簡單
臨界資源 - 被多個線程競爭的資源
當(dāng)多個線程競爭臨界資源的時候如果缺乏必要的保護措施就會導(dǎo)致數(shù)據(jù)錯亂
"""
import time
import threading

from concurrent.futures import ThreadPoolExecutor


class Account(object):
    """銀行賬戶"""

    def __init__(self):
        self.balance = 0.0
        self.lock = threading.Lock()

    def deposit(self, money):
        # 通過鎖保護臨界資源
        # 可以寫try-finally也可以使用上下文語法
        # self.lock.acquire()
        # try:
        #     pass
        # finally:
        #     self.lock.release()
        with self.lock:
            new_balance = self.balance + money
            time.sleep(0.001)
            self.balance = new_balance


def add_money(account, money):
    account.deposit(money)


# 自定義線程類
class AddMoneyThread(threading.Thread):

    def __init__(self, account, money):
        self.account = account
        self.money = money
        # 自定義線程的初始化方法中必須調(diào)用父類的初始化方法
        super().__init__()

    # run方法是線程啟動之后要執(zhí)行的回調(diào)方法(鉤子函數(shù))
    # 所以啟動線程不能夠直接調(diào)用run方法而是通過start方法啟動線程
    # 什么時候需要使用回調(diào)式編程?
    # 你知道要做什么但不知道什么時候會做這件事情
    def run(self):
        # 線程啟動之后要執(zhí)行的操作
        pass

def main():
    account = Account()
    # 創(chuàng)建線程池
    pool = ThreadPoolExecutor(max_workers=10)
    futures = []
    for _ in range(100):
        # 創(chuàng)建線程的第1種方式
        # threading.Thread(
        #     target=add_money, args=(account, 1)
        # ).start()
        # 創(chuàng)建線程的第2種方式
        # AddMoneyThread(account, 1).start()
        # 創(chuàng)建線程的第3種方式
        # 調(diào)用線程池中的線程來執(zhí)行特定的任務(wù)
        future = pool.submit(add_money, account, 1)
        futures.append(future)
    # 關(guān)閉線程池
    pool.shutdown()
    for future in futures:
        future.result()
    print(account.balance)


if __name__ == '__main__':
    main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市波闹,隨后出現(xiàn)的幾起案子摊册,更是在濱河造成了極大的恐慌漱竖,老刑警劉巖随静,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慷吊,居然都是意外死亡袖裕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門溉瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來急鳄,“玉大人,你說我怎么就攤上這事堰酿〖埠辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵触创,是天一觀的道長坎藐。 經(jīng)常有香客問我,道長哼绑,這世上最難降的妖魔是什么岩馍? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抖韩,結(jié)果婚禮上蛀恩,老公的妹妹穿的比我還像新娘。我一直安慰自己茂浮,他們只是感情好双谆,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著席揽,像睡著了一般佃乘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驹尼,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天趣避,我揣著相機與錄音,去河邊找鬼新翎。 笑死程帕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的地啰。 我是一名探鬼主播愁拭,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亏吝!你這毒婦竟也來了岭埠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惜论,沒想到半個月后许赃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡馆类,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年混聊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乾巧。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡句喜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沟于,到底是詐尸還是另有隱情咳胃,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布旷太,位于F島的核電站拙绊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泳秀。R本人自食惡果不足惜标沪,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗜傅。 院中可真熱鬧金句,春花似錦、人聲如沸吕嘀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偶房。三九已至趁曼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棕洋,已是汗流浹背挡闰。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掰盘,地道東北人摄悯。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像愧捕,于是被迫代替她去往敵國和親奢驯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容