• 笔记||Pyhton3进阶之多线程原理


    # 多线程

    # 一个进程相当于一个或多个线程

    # 当没有多线程编程时,一个进程也是一个主线程

    # 但有多线程编程时,一个进程包含多个线程,包括主线程

    # 使用线程 可以实现程序的并发

    # python3中多多线程支持的是threading模块

    # import threading

    # 在python3中,可以通过两种方法来创建线程

    '''
    两种方法:

         ① 使用threading.Thread直接在线程中运行函数(调用Thread类的构造器创建线程)。

             target参数:传入一个函数对象(函数名);

             args参数:传入一个元组,作为目标函数的入参;

             步骤如下:

                 1 - 调用Thread类的构造器创建线程对象,在创建对象时,target参数指定的函数将作为线程执行体

                 2 - 调用线程对象的star()方法启动该线程

         ② 继承Thread类创建线程类。

             步骤如下:

                 1 - 定义Thread类的子类,并重写该类的run()方法,run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体

                 2 - 创建Thread子类的实例,即创建线程对象

                 3 -调用线程对象的star()方法来启动线程

         推荐使用第一种方式来创建线程,这种方式编程简单,线程直接包装target函数,具有更清晰的逻辑结构
    '''

    # 如何获取主线程的名称

    # threading.current_thread().getName()

    # 线程的调度方式

    # start方法 启动线程

    # join方法 等待线程

    import threading

    import time


    def thread_run(name):

    time.sleep(2)

    print("%s first thread!!!" % name)


    t1 = threading.Thread(target=thread_run, args=('peiyanan', ))

    t2 = threading.Thread(target=thread_run, args=('tanyongling', ))

    t1.start()

    t2.start()

    t1.setName('子线程1') # 设置线程的名称name

    print(t1.name) # 打印线程名

    print(t1.getName()) # 获取线程名称

    print(t1.is_alive()) # isalive()方法用于判断线程是否运行 未运行会显示False

    # t1.join()
    # t2.join()  
    # print('主线程正在运行!!')


    # -------------------------------------------------------


    # 如何优雅的使用多线程

    # 可以使用for循环来控制创建线程的数量

    # menu = ['数学', '英语', '语文', '地理', '历史']

    # for m in menu:

    #         t = threading.Thread(target=thread_run, args=(m, 2))

    #         t.start()


    # 线程调度

    # 操作系统不会让一个线程一直占用CPU的

    # 线程的生命周期
    '''
    四个状态:
    ①新建状态 指该线程已经初始化,但还没启动
    ②运行状态 指线程的正常执行状态
    ③阻塞状态 指线程处于执行状态,但由于没有获得CPU的执行时间,而处在CPU外部等待线程执行的状态
    ④死亡状态 指线程执行结束
    '''

    # 使用线程需要注意到的点
    '''
    线程独有的资源
    调用的函数局部变量,线程都会有个自己的拷贝
    不会冲突
    线程有时会给开发上带来麻烦:如 共享数据的访问,比如全局变量
    '''

  • 相关阅读:
    通信的真正端点不是主机而是主机中的进程
    futures
    What's the customers care is only Myinput and Uroutput on the Cloud.What's more,MySecurity.
    r
    迭代器遍历列表 构造方法 constructor ArrayList Vector LinkedList Array List 时间复杂度
    2009年4月,Twitter宣布他们已经把大部分后端程序从Ruby迁移到Scala
    So the type system doesn’t feel so static.

    Unit redis-server.service is masked.
    Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践
  • 原文地址:https://www.cnblogs.com/peipei-Study/p/12095400.html
Copyright © 2020-2023  润新知