0%

Python基础--线程

Python基础–线程

线程的理解

  • 线程是cpu调度(执行)的单位
  • 程序会自动启用一个主线程
  • 子线程是人为创建

    线程是在进程的基础上进行运行的,可以说,没有进程就不会产生线程. ==在当前进程下的所有线程下,变量是被共享的==
    线程的执行方式稍微有一点奇怪,在人们看来可以说是同时执行的,但是其实不是的. 线程是有CPU分配资源,随机进行运行的.每个线程都会运行一小段时间,然后运行其他线程.

线程的作用

  • 完成多任务,提高cpu效率
  • 线程的执行是需要CPU的调度完成

    多线程的使用

    1
    2
    3
    导包 import threading
    加入任务 threading.Thread(target=任务名)
    开启 xxx.start()

    参考实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import time		 # 导入时间包
    import threading # 导入线程包


    def dance():
    """执行跳舞"""
    while True:
    print("跳舞")
    time.sleep(5)


    def song():
    """执行唱歌"""
    while True:
    print("唱歌")
    time.sleep(5)




    def main():
    """多线程开启"""
    # threading.Thread(target=任务名)
    thread_song = threading.Thread(target=song)
    thread_dance = threading.Thread(target=dance)
    # 开启
    thread_song.start()
    thread_dance.start()


    if __name__ == '__main__':
    main()

    多线程传参两种方式

  • args使用元组
    • 表示已元组的方式传参
    • 传的元素位置需要与函数的形参位置一一对应
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      import threading
      import time


      def dance():
      """执行跳舞"""
      while True:
      print("跳舞")
      time.sleep(1)


      def song(name,age):
      """执行唱歌"""
      while True:
      print("唱歌",name,age)
      time.sleep(1)


      def main():
      """入口函数"""
      # 一边唱歌一边跳舞
      thread_song = threading.Thread(target=song,args=("小白",18))

      thread_song.start()


      if __name__ == '__main__':
      main()
  • kwargs使用字典
    • 表示以字典的形式传参
    • 因为是无序的,所有key和参数对应,vlaue就是参数
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      import threading
      import time


      def dance(name,age):
      """执行跳舞"""
      while True:
      print("跳舞")
      time.sleep(1)


      def song(name,age):
      """执行唱歌"""
      while True:
      print("唱歌",name,age)
      time.sleep(1)


      def main():
      """入口函数"""
      # 一边唱歌一边跳舞
      thread_song = threading.Thread(target=song,args=("小白",18))
      thread_song.start()

      thread_dance = threading.Thread(target=dance,kwargs={"age":18,"name":"小花"})
      thread_dance.start()

      if __name__ == '__main__':
      main()

      多线程的注意点

  • 主线程会等待子线程结束而结束
  • 守护线程,只要主线程结束守护线程就结束
  • 线程执行是无序的
  • 线程之间共享全局变量(共享就会有资源竞争的问题)
  • 资源竞争解决方案
    • 同步join
      • join函数是将多个线程或者进程按照单线程的方式执行,执行了一个线程之后再去执行另外一个线程
      • 缺点运算速度比较慢
    • 互斥锁