python线程学习之数据共享

ernestwang 786 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 =', num)
  • 线程锁
    import threading
    
    money = 250
    
    def run(n):
        global money
        for i in range(1000000):
            '''
              # 获取锁
              lock.acquire()
              try:
                  # 原则上运算之后不会修改money
                  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:
            t1 = threading.Thread(target=run, args=(5,))
            t2 = threading.Thread(target=run, args=(10,))
            t1.start()
            t2.start()
            t1.join()
            t2.join()
            if money != 250:
                break
        print(money)
  • 线程类
    from threading import Thread
    import time
    
    # 自定义线程类,需要继承自Thread
    class EmailThread(Thread):
        def __init__(self, email):
            super().__init__()
            self.email = email
        
        # 执行线程的start方法,就会调用
        def run(self):
            print('邮件发送开始')
            print('邮件:',self.email)
            for i in range(6):
                time.sleep(1)
                print('发送进度:{}'.format(i * 20))
            print('邮件发送完毕')
            
    if __name__ == '__main__':
        print('主线程开始')
        et = EmailThread('恭喜你中奖1000000!')
        et.start()
        et.join()
        print('主线程结束')   
  • 定时线程
    import threading
    import os
    
    def run():
        # os.system('start cmd')
        os.system('start calc')
        
    if __name__ == '__main__':
        # 定时线程:3s后执行线程函数run
        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
关注微信公众号,站长免费提供流量增长方案。
我知道了