zoukankan      html  css  js  c++  java
  • python 线程

    线程

    线程简介

    • 在一个进程中,若想做多个子任务,我们把这些子任务称为线程。

    • 线程可以理解为轻量级的进程。

    • 进程之间的数据是独立的,而一个进程下的线程数据是共享的。

    • 线程是CPU分配时间的最小单位。进程和线程的调度都是操作系统的事。

    • 一个进程默认都有一个线程,我们称为主线程。

    线程模块

    • _thread:低级模块

    • threading:高级模块,是对_thread的封装

    • 以后建议大家使用高级模块threading

    线程模块_thread

    • 示例:

      import _thread
      import time
      ​
      def loop():
          print('子线程开始')
          print('子线程结束')
          
      if __name__ == '__main__':  
          print('主线程开始')
          # 创建线程
          _thread.start_new_thread(loop, ())
          # 主线程结束,子线程立即结束,通过演示测试
          time.sleep(3)
          print('主线程结束')

    非常简陋,不建议使用

    线程模块threading

    • 基本使用

      import threading
      import time
      ​
      def run(num):
          c = threading.current_thread()
          print('子线程开始', c.name)
          time.sleep(3)
          print(num)
          # print(threading.active_count())
      print('子线程结束', c.name)
          
      if __name__ == '__main__':
          # 获取主线程
          t = threading.main_thread()
          print('主线程开始:', t.name)
          # 获取当前线程
          # c = threading.current_thread()
          # print('当前线程:', c.name)
      # 创建子线程
          sub = threading.Thread(target=run, args=(250,), name='下载美女图片')
      ​
          # 启动子线程
          sub.start()
      ​
          # 活跃线程个数
          # print(threading.active_count())
          # 线程列表
          # print(threading.enumerate())
      ​
          time.sleep(1)
          # 判断线程是否是活着的
          print(sub.is_alive())
          # 等待子线程
          sub.join()
      ​
          print(sub.is_alive())
      ​
          print('主线程结束:', t.name)

    数据共享

    • 示例:全局变量可以共享

      
      
      import threading
      ​
      # 全局变量
      num = 250def thread_one():
          global num
          num += 10def thread_two():
          global num
          num -= 100if __name__ == '__main__':
          print('主线程:', num)
          t1 = threading.Thread(target=thread_one)
          t1.start()
          t1.join()
          print('主线程:', num)
          t2 = threading.Thread(target=thread_two)
          t2.start()
          t2.join()
          print('主线程:', num)

      线程之间共享进程的所有数据

    • 示例:多线程操作同一变量,可能会出错,代码见04-gongxiang.py

    • 示例:加锁解决数据错乱问题(线程锁)

    •  import threading
      ​
        # 这是你银行的存款
        money = 250def run(n):
            global money
      ​
            for i in range(100000):
                '''
                lock.acquire()
                try:
                    # 运算之后,数据应该不变
                    money = money + n
                    money = money - n
                finally:
                    lock.release()
                '''
                # 简化书写
                with lock:
                    money = money + n
                    money = money - n
      ​
        if __name__ == '__main__':
            lock = threading.Lock()
            # while True:
            t1 = threading.Thread(target=run, args=(10,))
            t2 = threading.Thread(target=run, args=(15,))
            t1.start()
            t2.start()
            t1.join()
            t2.join()
      ​
                # if money != 250:
                #     break
      print(money)
  • 相关阅读:
    find命令的高级用法之print0及depth
    shell中的单引号和双引号的区别
    基于apache的虚拟主机
    duilib禁止標題欄雙擊放大窗口
    sqlite查询问题,由字母大小写敏感引起
    问题记录,Release模式和Debug运行效果不一样,Release必须加延时
    子函数内malloc分配内存,论如何改变指针参数所指内存,二级指针、三级指针的应用
    如何具体分配一大块堆内存中的各个部分、如何指针转化为地址、如何求指针间地址偏移量(谈谈最近遇到的一个坑爹的接口需求)
    C++ GUID和string转化函数【转载】
    第一次做C++项目的一点小总结
  • 原文地址:https://www.cnblogs.com/kiki5881/p/8610536.html
Copyright © 2011-2022 走看看