线程基础


01.使用threading()库可以实现多线程。

  • 线程声明的格式为:
threading.Thread(group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)
  • target,要使用多线程的函数对象。
  • args,为目标函数传递的实参,其值为一个元组。
  • kwargs,为目标函数传递的关键字参数,其值为一个字典。
  • name,多线程的名称。
  • 线程的简单示例:
import threading
import time


def display(x):
    count = 0
    # 当count大于x时线程结束
    while True:
        if count > x:
            raise Exception("Thread Error")
        time.sleep(2)
        print("this is a child thread!, count is {}".format(count))
        print("i will not stop even main thread stop!")
        count += 1


if __name__ == "__main__":
        # 创建一个线程,目标为display函数,使用关键字传参数
        t = threading.Thread(target=display, name='test', kwargs={"x": 5})
        t.start()

# 主线程执行,等待子线程结束后退出
print("i am main thread, now i closed!")
  • threading.Thread()之外的代码逻辑为主线程,threading.Thread()创建的实例对象为工作线程。
  • 主线程执行全部的代码后,会等待工作线程全部执行完之后再退出;若主线程强行退出,则工作线程也会退出。
    • 工作线程有诸如while True之类的代码逻辑,可以确保工作线程永远执行,而主进程也不会退出。
  • python的线程没有优先级,线程也不能被销毁,停止,挂起,结束线程的方式仅包含:
    • 线程函数内的语句正常执行完毕。
    • 线程函数中抛出未处理的异常。


02.线程的属性和方法:

  • threading的方法包括:
    • current_thread(),返回当前线程对象。
    • main_thread(),返回主线程对象。
    • active_count(),当前处于alive状态的线程个数,包括主线程。
    • enumerate(),返回所有或活着的线程的列表,不包括已经终止的线程和未开始的线程。
    • get_ident(),返回当前线程的id,其值为非0整数。
  • threading.Thread实例的属性和方法包括:
    • name,线程的名称,只是一个标记,可以重名;可以通过getName(),setName()获取和设置。
    • ident,线程id,它是非0整数,线程启动后才会有id,否者为None。
      • 线程退出,线程id依旧可以访问。
      • 线程id不能重名,但可以重复使用。
    • is_alive(),返回线程是否存活。
    • start(),启动一个线程,每一个线程必须且只能执行该方法一次。
    • run(),运行线程函数,该调用会在主线程中直接运行而不会另起一个线程,因此会阻塞(挂起主进程)。
  • 同一个线程对象只能被调用一次,比如:
import threading
import time


def display(x):
    count = 0
    while True:
        if count > x:
            raise Exception("Thread Error")
        time.sleep(1)
        print("this is a child thread!, count is {}".format(count))
        print("Thread name is {} and Thread id is {}".format(t.name, t.ident))
        count += 1
        print("Thread is working......")


if __name__ == "__main__":
        t = threading.Thread(name='thread_test', target=display, args=(5,))
        t.start()

        while True:
            time.sleep(1)
            if t.is_alive():
                print("thread is alive, name is {} and id is {}".format(t.name, t.ident))
            else:
                print("thread is stopped!")
                t.start()

print("i am main thread, now i closed!")
  • t已经运行过一次,当t终止时,不能第二次启动;如果需要启动,则必须创建一个新的线程。


03.线程的注意事项:

  • 线程需要被操作系统调度,有上下文切换的成本,因此不是越多越好。
  • 提高每个线程的执行效率,比增加多个线程更重要。
文档更新时间: 2021-10-04 00:19   作者:闻骏