• 进程和线程相关


    一、操作系统/应用程序

    1、硬件

    硬件包括硬盘、cpu、主板、显卡、内存、电源........

    2、系统

    系统就是由程序员写出来的软件,该软件用于控制计算机的硬件,让他们相互配合工作

    3、安装软件(安装应用程序)

    二、线程和进程

    应用程序调用操作系统的线程和进程

    单进程、多线程的应用程序

    1 import threading
    2     print('666')
    3 
    4         def func(arg):
    5     print(arg)
    6     t = threading.Thread(target=func) #创建线程
    7     t.start()
    8 
    9     print('end')   #主线程

    一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认只有一个)

    操作系统帮助开发者操作硬件

    python在多线程和多进程的情况

    1、多线程情况下

      计算机密集型操作:效率低。(GIL锁)

      IO操作:效率高

    2、多进程的情况下

      计算机密集型:效率高(浪费资源,不得已而为之)

      IO操作:效率高

    对于python进程和线程的选择:

      计算机密集型:多进程

      IO操作:多线程

    3、GIL锁:是全局解释器锁。用于限制一个进程中同一个时刻只有一个线程被CPU处理  

      扩展:默认GIL锁在执行100个CPU指令(过期时间)

    1 import sys
    2 v1=sys.getcheckinterval()
    3 print(v1)   #100

    三、在python中主线程和子线程的执行情况

    1、主线程默认等待子线程执行

    1 import time
    2 def func(arg):
    3     time.sleep(arg)
    4     print(arg)
    5 t1 = threading.Thread(target=func,args=(3,))
    6 t1.start()
    7 t2 = threading.Thread(target=func,args=(9,))
    8 t2.start()
    9 print(123)  
    # 打印结果 123,3,9

    当把time.sleep(arg)去掉时打印结果:3,9,123

    2、主线程不在等待子线程,主线程执行完毕则所有子线程终止(子线程在可以在主线程之前完成)
    加上   子线程.setDaemon()

     1 import time
     2 def func(arg):
     3     time.sleep(2)
     4     print(arg)
     5 
     6 t1 = threading.Thread(target=func,args=(3,))
     7 t1.setDaemon(True) #设置等待
     8 t1.start()
     9 
    10 t2 = threading.Thread(target=func,args=(9,))
    11 t1.setDaemon(True)
    12 t2.start()
    13 print(123)

    3、开发者可以控制主线程等待子线程的时间(最多等待时间)

     1 import time
     2 def func(arg):
     3     time.sleep(0.01)
     4     print(arg)
     5 
     6 print('创建子线程t1')
     7 t1 = threading.Thread(target=func,args=(3,))
     8 t1.start()
     9 # 无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走。
    10 # 有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续往下走。
    11 t1.join(2)
    12 
    13 print('创建子线程t2')
    14 t2 = threading.Thread(target=func,args=(9,))
    15 t2.start()
    16 t2.join(2) # 让主线程在这里等着,等到子线程t2执行完毕,才可以继续往下走。
    17 
    18 print(123)

    当超过等待时间子线程未执行完成,主线程继续往下走,当主线程执行完毕后会继续执行未执行完的子线程,这时主线程才算执行完毕

    4、获取线程名称

     1 def func(arg):
     2     t=threading.current_thread()# 获取当前线程信息
     3     name=t.getName() #获取当前线程名称
     4     print(name)
     5 
     6 t1 = threading.Thread(target=func,args=(3,))
     7 t1.setName("线程1")
     8 t1.start()
     9 
    10 t2 = threading.Thread(target=func,args=(9,))
    11 t2.setName("线程2")
    12 t2.start()
    13 
    14 print(123)


    5、线程本质

    1 def func(arg):
    2     t=threading.current_thread()# 获取当前线程信息
    3     name=t.getName() #获取当前线程名称
    4     print(name)
    5 
    6 t1 = threading.Thread(target=func,args=(3,))
    7 t1.setName("线程1")
    8 t1.start() #不是执行线程,而是告诉cpu可以被调度了
    9 print(123)

    这个需要根据CPU的情况而定

    总结:

    1、线程是CPU工作的最小单元,创建线程是为了利用多核优势实现操作

    2、创建进程是为了做数据隔离,进程是为了提供环境让线程工作

    3、在python中存在一个GIL锁

      影响:多线程无法利用多核优势

      解决:创建多进程

    4、IO密集型:多线程

      计算机密集型:多进程

  • 相关阅读:
    日记1
    JDK、JRE、JVM三者间的关系
    线性表之二,SLINKLIST(单链表)类,模板类及C链表(增删改查,广义表
    线性表之一,SEQLIST(顺序表)类及其父类LIST,模板类及C结构体,包装顺序表
    PTA(中国人民解放军陆军工程大学数据结构,C语言)
    冒泡排序
    选择排序、堆排序
    冒泡排序,快速排序
    springMVC定时器
    MD5加密
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/9621044.html
Copyright © 2020-2023  润新知