python学习之多线程的特点与同步&互斥锁

1.
1.1线程之间的执行是无序的
线程调度是根据CPU调度决定的

import time
import threading
def task():
    time.sleep(1)
    print("当前线程是:  ",threading.current_thread().name)
if __name__ == '__main__':
    #每循环一次就创建一个子线程
    for i in range(5):
        t = threading.Thread(target=task)
        #启动子线程
        t.start()
import time
import threading
# 1.2线程之间共享资源
li = [] #定义全局变量
def wdata():
    for i in range(5):
        li.append(i)
        time.sleep(1)
    print('写入的数据是: ',li)
def rdata():
    print('读取的数据是: ',li)
if __name__ == '__main__':
    #创建子线程
    wd = threading.Thread(target=wdata)
    rd = threading.Thread(target=rdata)
    wd.start()
    wd.join()
    rd.start()
    wd.join()
import threading
# 1.3资源竞争
a = 0
b = 1000000
def add1():
    for i in range(b):
        global a
        a += 1
    print("第一次累加:",a)

def add2():
    for i in range(b):
        global a
        a += 1
    print("第二次累加:",a)
# add1()
# add2()
if __name__ == '__main__':
    a1 = threading.Thread(target=add1)
    a2 = threading.Thread(target=add2)
    a1.start()
    a2.start()
2.线程同步
主线程和创建的子线程之间各自执行完自己的代码直至结束
方式: 1. 线程等待 2.互斥锁
2.1. 线程等待
import threading
a = 0
b = 1000000
def add1():
    for i in range(b):
        global a
        a += 1
    print("第一次累加:",a)

def add2():
    for i in range(b):
        global a
        a += 1
    print("第二次累加:",a)
# add1()
# add2()
if __name__ == '__main__':
    a1 = threading.Thread(target=add1)
    a2 = threading.Thread(target=add2)
    a1.start()
    a1.join()   #等待a1子线程执行结束以后,代码再继续往下执行,开始执行a2子线程
    a2.start()
    a2.join()

2.2.互斥锁
概念:对共享资源进行锁定,保证多个线程访问共享数据不会出现共享数据错误问题:保证统同一时刻只能由一个线程去操作
方法:
acquire():上锁
release():释放锁
注意:两个方法必须同时出现,否则容易出现死锁
死锁;一直等待对方释放锁的情景就是死锁
会造成应用程序停止响应,不能再处理其他任务
互斥锁的缺点:会影响代码的执行效率

import threading
# 1.导入模块
from threading import Lock
# 2.创建全局互斥锁
lock = Lock()
a = 0
b = 1000000
def add1():
    # 3.上锁
    lock.acquire()
    for i in range(b):
        global a
        a += 1
    print("第一次累加:",a)
    # 4.释放锁
    lock.release()

def add2():
    lock.acquire()
    for i in range(b):
        global a
        a += 1
    print("第二次累加:",a)
    lock.release()

if __name__ == '__main__':
    a1 = threading.Thread(target=add1)
    a2 = threading.Thread(target=add2)
    a1.start()
    a2.start()

2.3 总结
互斥锁的作用:保证同一时刻只有一个线程去操作共享数据,保证共享数据不会出现错误问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值