#!/usr/local/bin/python3
"""
多線程程序如果沒有競爭資源的場景那么通常會比較簡單
臨界資源 - 被多個線程競爭的資源
當多個線程競爭臨界資源的時候如果缺乏必要的保護措施就會導致數據錯亂
"""
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
# 自定義線程的初始化方法中必須調用父類的初始化方法
super().__init__()
# run方法是線程啟動之后要執行的回調方法(鉤子函數)
# 所以啟動線程不能夠直接調用run方法而是通過start方法啟動線程
# 什么時候需要使用回調式編程?
# 你知道要做什么但不知道什么時候會做這件事情
def run(self):
# 線程啟動之后要執行的操作
pass
def main():
account = Account()
# 創建線程池
pool = ThreadPoolExecutor(max_workers=10)
futures = []
for _ in range(100):
# 創建線程的第1種方式
# threading.Thread(
# target=add_money, args=(account, 1)
# ).start()
# 創建線程的第2種方式
# AddMoneyThread(account, 1).start()
# 創建線程的第3種方式
# 調用線程池中的線程來執行特定的任務
future = pool.submit(add_money, account, 1)
futures.append(future)
# 關閉線程池
pool.shutdown()
for future in futures:
future.result()
print(account.balance)
if __name__ == '__main__':
main()
并發編程—創建多線程的三種方式
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 眾所周知創建線程的方式有兩種:1.繼承Thread類。2.實現Runnable接口。從jdk1.5開始,提供了另一...
- 1,繼承Thread 主要掌握:線程的初始化,啟動,中斷的正確處理方式(interrupted) public c...
- 多線程的創建方式 定義 Thread 類的子類創建 多次執行程序得到的結果可能不同 創建 Runnable 接口實...