python-多线程

1
2
3
4
5
多线程是什么?
为什么需要使用多线程,多线程的作用?
怎么使用多线程,join方法的作用?
python多线程弊端?
python多线程其他机制?
  • 多线程是什么?

线程是程序的最小单元,程序运行时,实际是线程在解释器中执行工作;

  • 为什么需要使用多线程,多线程的作用?

python的多线程是假的多线程,在进程中同时最多只能有一个线程在解释器中运行,这是由python的全局解释器(GIL)来控制的,具体过程为“生成gil-线程运行-线程休眠(gil上锁)-运行其他线程-再次运行此线程时(需要将上一个线程上锁,并解锁此线程)”,这种虽然是假的多线程,但是可以在一个线程等待时,运行另一个线程,使单核得到充分利用;

  • 怎么使用多线程,join方法的作用?
1
2
3
4
5
6
import threading
#fun是函数,arg是参数
t1=threading.Thread(fun,arg)
t1.start()
t1.join()
print("主线程执行")

join方法的作用是子线程劫持主线程,仅当子线程执行完之后,才能执行主线程,常用于爬虫,如爬取多个资源时,使用多线程,每个子线程添加join等待,仅当爬虫子线程爬取完资源后,才能进行下一步操作(运行主线程)

  • python 多线程的弊端

python多线程的GIL机制,导致python同时只能执行一个线程,只能使用单核,在多核机器上会存在巨大的资源浪费;因此多线程多用于高IO操作,尽量避免在多cpu计算场景下使用,该场景下应使用多进程;

  • python多线程其他机制?
1
python守护线程?
  • python的守护线程?
    python主线程运行时,默认会等待子线程运行结束后主线程才能结束,但我们可以在子线程启动前,将子线程添加到守护线程里,这样的话哪怕该守护子线程未结束,只要主线程结束了,守护线程也会跟着结束;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import threading
    #fun是函数,arg是参数
    t1=threading.Thread(fun,arg)
    t1.setDaemon(True)#设置守护线程必须在该子线程执行前
    t1.start()
    t1.join()
    print("主线程执行") #主线程结束后,子线程会跟着结束,不会执行

    线程的其他常用方法:

    run(): 线程被cpu调度后自动执行线程对象的run方法
    start():启动线程活动。
    isAlive(): 返回线程是否活动的。
    getName(): 返回线程名。
    setName(): 设置线程名。

    threading模块提供的一些方法:
    threading.currentThread(): 返回当前的线程变量。
    threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
    threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

总结:python的多线程支持多任务,但多任务并不支持并行运行(同时运行),只是利用了cpu的多道技术,支持任务的切换;

欢迎关注我的其它发布渠道