Python基础8:线程

本文详细介绍了Python编程中的线程概念,包括如何创建线程,使用守护线程确保程序退出时的清理工作,以及利用互斥锁避免资源竞争问题,提升并发性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程、守护线程、互斥锁


'''
线程:执行代码的分支,程序默认会有一个线程(主线程)
'''
import threading, time

def AA(count):
    for i in range(count):
        print('AA')
        time.sleep(0.3)

def BB(count):
    for i in range(count):
        print('BB')
        print(threading.current_thread().getName())


if __name__ =='__main__':
    #创建子线程(执行代码)
    sub_thread = threading.Thread(target = AA, args=(5,))
    three_thread = threading.Thread(target= BB, kwargs={'count':5})

    # 设置守护线程,主线程结束,子线程也结束
    sub_thread.setDaemon(True)
    #sub_thread = threading.Thread(target = AA, args=(5,), daemon= True)

    #启动线程
    #线程只能启动(调用)一次
    #线程执行没有顺序,跟cpu调度相关
    sub_thread.start()
    three_thread.start()

    #获取当前线程的名字
    print(threading.current_thread().getName())

    sub_thread.setName('bbbb')
    print(threading.current_thread().getName())

    #获取线程id(启动以后才有)
    print(threading.current_thread().ident)

    #判断线程是否存活
    print(threading.current_thread().is_alive())

    print(threading.active_count())

    #主线程等子线程结束之后,才会结束


#run()and start()
def work():
    count = 1
    while True:
        if count >=4:
            break
        time.sleep(1)
        count += 1
        print(threading.current_thread().name, threading.current_thread().ident)

t1 = threading.Thread(target=work)
t2 = threading.Thread(target=work)

t1.start()
t2.start()

#start()才会开启新线程,并调用run()
#run()实际上是将方法调用了一下,并没有开启线程

#重写
class MyThread(threading.Thread)
    def start(self):

        super(MyThread, self).start()



'''
互斥锁
资源竞争
有个全局变量,保证同一时刻只有一个线程去执行代码
'''
import threading

lock =threading.Lock()

g_num = 0

def AA():

    #上锁
    lock.acquire()
    global g_num
    for i in range(1000000):
        g_num +=1
    print('AA', g_num)

    #释放锁
    lock.release()

def BB():

    #上锁
    lock.acquire()
    global g_num
    for i in range(1000000):
        g_num +=1
    print('BB', g_num)

    #释放锁
    lock.release()

if __name__ == '__main__':
    ft = threading.Thread(target=AA)
    sc = threading.Thread(target=BB)

    ft.start()
    sc.start()

    #这个线程执行时,其他线程等待,保证g_num结果正确
    ft.join()
    sc.join()
    print(g_num)
'''
166525
AA 1342195
BB 1359639
'''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值