#!/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 接口实...