python高级培训第三课

本文详细介绍了Python中的多线程概念及其创建方式,包括通过函数和类两种方式。同时,讨论了多线程的特性如t.join()、查看活动线程和设置守护线程。此外,重点讲解了线程锁的使用,通过实例展示了如何在并发操作中避免数据不一致问题。最后,还介绍了递归锁的概念,确保线程间修改变量的独立性。
摘要由CSDN通过智能技术生成

目录

创建多线程

多线程特性

线程锁

递归锁


创建多线程

什么是线程:线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行

什么是进程:即为程序,程序与程序之间是相互独立的。

创建多线程:

#创建多线程
def test(x):
    print(x)
    time.sleep(2)

t1 = threading.Thread(target = test,args = 1)
t2 = threading.Thread(target = test,args = 2)
t1.start()
t2.start()

#以类的方式创建
class MyThread(thraeding.Thread):
    def __init__(self.n):
        super(MyThread,self).__init__()
        self.n = n

    def run(self):
    print('以类的方式创建多线程',self.n)

r1 = MyThread(11)
r2 = MyThread(11)
r1.start()
r2.start()


 

多线程特性

t.join特性:

 查看活动线程:threading.acttive_account()

查看当前线程:threading.current_thread()

设置守护线程(必须有主线程):setDaemon(True)

线程锁

为什么需要线程锁:多个线程对同一个数据进行修改时, 可能会出现不可预料的情况。

如何实现线程锁:

1. 实例化一个锁对象;
lock = threading.Lock()
2. 操作变量之前进行加锁
lock.acquire()
3. 操作变量之后进行解锁
lock.release()

实例:

import threading


#  银行存钱和取钱
def add(lock):
    global money  # 生命money为全局变量
    for i in range(1000000):
        # 2. 操作变量之前进行加锁
        lock.acquire()
        money += 1  # money;  money+1; money=money+1;
        # 3. 操作变量之后进行解锁
        lock.release()


def reduce(lock):
    global money
    for i in range(1000000):
        # 2. 操作变量之前进行加锁
        lock.acquire()
        money -= 1
        # 3. 操作变量之后进行解锁
        lock.release()


if __name__ == '__main__':
    money = 0
    # 1. 实例化一个锁对象;
    lock = threading.Lock()

    t1 = threading.Thread(target=add, args=(lock,))
    t2 = threading.Thread(target=reduce, args=(lock,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

    print("当前金额:", money)

递归锁

为什么需要递归锁:保证线程之间改变变量的独立性。

怎么使用递归锁:多个线程共同修改一个变量时一定要加上递归锁。

实例:

import threading,time


def run1():
    '''
    定义第一个程序来创建一个修改参数的线程
    :return: 
    '''
    print("Grab the first part data.")
    lock.acquire()
    global num
    num += 1
    lock.release()
    return num

def run2():
    '''
    定义第二个程序来创建一个修改参数的线程
    :return: 
    '''
    print("Grab the second part data.")
    lock.acquire()
    global num2
    num2 += 1
    lock.release()
    return num2

def run3():
    '''
    定义第三个程序来创建一个修改参数的线程
    :return: 
    '''
    lock.acquire()
    res = run1()
    print("----------Between run1 and run2------------- ")
    res2 = run2()
    print(res, res2)
    lock.release()

# 初始化主线程中的变量
num, num2 = 0, 0
# 实例化递归锁
lock = threading.RLock()
# 循环创建线程改变参数
for i in range(9):
    t = threading.Thread(target=run3)
    t.start()

# 判断线程是否都执行结束
while threading.active_count() != 1:
    print(threading.active_count())
else:
    print("--------All threads done--------")
    print(num, num2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值