python:线程数据共享和线程锁知识大全

ernestwang 978 0

  • 数据共享
    import threading
    
    # 全局变量:线程之间可以共享
    num = 250
    
    def run():
        global num
        num += 10
        print('子线程修改全局变量') 
        
    if __name__ == '__main__':
        thr = threading.Thread(target=run)
        thr.start()
        thr.join()
        print('主进程结束', num)    
  • 线程锁
    import threading
    
    money = 250
    
    def run(n):
        global money
        for i in range(100000):
            '''
            # 获取锁
            lock.acquire()
            try:
                money += n
                money -= n
            except Exception as e:
                print('出现异常:', e)
            finally:
                # 释放锁
                lock.release()
            '''
            # 简化操作
            with lock:
                money += n
                money -= n   
                
    if __name__ == '__main__':
        # 创建线程锁
        lock = threading.Lock()
        while True:
            thr1 = threading.Thread(target=run, args=(5,))
            thr2 = threading.Thread(target=run, args=(10,))
            thr1.start()
            thr2.start()
            thr1.join()
            thr2.join()
            if money != 250:
                break
        print(money)
  • 线程类
    from threading import Thread
    import time
    
    # 自定义线程类
    class EmailThread(Thread):
        def __init__(self, email):
            super().__init__()
            self.email = email
    
        def run(self):
            print('邮件发送开始')
            print('发送邮件:', self.email)
            for i in range(1, 6):
                print('发送进度:{}%'.format(i * 20))
                time.sleep(1)
                print('邮件发送结束')
                
    if __name__ == '__main__':
        print('主线程开始')
        thr = EmailThread('恭喜你中奖了!')
        thr.start()
        thr.join()
        print('主线程结束') 
  • 定时线程:延时线程
    import threading
    import os
    
    def run():
        os.system('calc')
        
    if __name__ == '__main__':
        # 创建定时线程:3秒后开始执行线程任务
        t = threading.Timer(3, run)
        t.start()
        t.join()
  • 信号传递:控制另一线程的执行
    import threading
    import time
    
    def run(num):
        for i in range(num):
            # 等待条件成立,程序会阻塞
            e.wait()
            print('子线程执行:{}'.format(i+1))
            # 清除条件,再次wait又会阻塞
            e.clear()  
            
    if __name__ == '__main__':
        e = threading.Event()
        num = 3
        thr = threading.Thread(target=run, args=(num,))
        thr.start()
        for i in range(num):
            time.sleep(1)
            # 设置条件,wait处将不再阻塞
            e.set()
            print('走你...')

标签: 线程 python

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

复制成功
微信号: irenyuwang
关注微信公众号,站长免费提供流量增长方案。
我知道了