Python 本地线程变量

– Start

点击此处观看本系列配套视频。


假设我们有两个线程随机转账,我们增加了审计功能。

from threading import Thread, Lock
import threading
from random import randint


# 定义账户类
class Account:
    def __init__(self, debit):
        self.debit = debit
        self.lock = Lock()

    def increase(self, amount):
        with self.lock:
            self.debit += amount


account = Account(0)


# 启动两个线程同时转账
def transfer():
    total_amount = 0 # 审计变量
    for i in range(10000):
        amount = randint(1, 10)
        account.increase(amount)
        total_amount += amount
    # 打印出每个线程的转账总额
    print(f'{threading.current_thread().getName()} transfered {total_amount}')


t1 = Thread(target=transfer)
t2 = Thread(target=transfer)

t1.start()
t2.start()

# 等待 t1 和 t2 结束,打印结果
t1.join()
t2.join()
print(account.debit)

除此之外,我们还可以使用本地线程变量。

from threading import Thread, Lock
import threading
from random import randint


# 定义账户类
class Account:
    def __init__(self, debit):
        self.debit = debit
        self.lock = Lock()

    def increase(self, amount):
        with self.lock:
            self.debit += amount


account = Account(0)
# audit 是 Global 变量
audit = threading.local()


# 启动两个线程同时转账
def transfer():
    # audit.total_amount 是 local 变量,每个线程独立
    audit.total_amount = 0
    for i in range(10000):
        amount = randint(1, 10)
        account.increase(amount)
        audit.total_amount += amount
    # 打印出每个线程的转账总额
    print(f'{threading.current_thread().getName()} transfered {audit.total_amount}')


t1 = Thread(target=transfer)
t2 = Thread(target=transfer)

t1.start()
t2.start()

# 等待 t1 和 t2 结束,打印结果
t1.join()
t2.join()
print(account.debit)

– 更多参见:Python 精萃
– 声 明:转载请注明出处
– Last Updated on 2018-10-10
– Written by ShangBo on 2018-10-10
– End

你可能感兴趣的:(Python)