python线程学习之数据共享

    Python编程 wuya 55次浏览 已收录 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)
    发表我的评论
    取消评论
    表情 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址