zoukankan      html  css  js  c++  java
  • python3线程介绍01(如何启动和调用线程)

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import os
    import time,random
    import threading

    # 1-进程说明
    # 进程是软件、程序执行的一个实例,每个运行的程序,可创建多个进程,但至少包含1个进程,进程提供程序执行时需要的所有资源
    # 进程可以包含线程,每个进程至少包含一个线程
    # 进程启动时,会创建1个线程即主线程,然后通过主线程创建需要的其他子线程


    # 2-线程说明
    # 线程是进程中的一个实体,为程序执行的最小单元,也是可被独立分派和执行基本单位
    # 线程由线程ID,指令指针(PC)、寄存器集合、堆栈组成
    # 线程不独占资源,可与同属同一进程的其他线程共享进程中的资源
    # 每个应用程序,至少包含一个进程和一个线程
    # 单个程序允许多个线程,完成不同的分工,被称为多线程处理

    # 线程即执行上下文,1个CPU执行时所需的一串指令

    # 3-多任务说明
    # 执行多任务可通过 1-开启多个进程,每个进程包含1个线程,2-开启1个进程,进程中有多个线程,3-多个进程,每个进程包含多个线程
    # 子进程返回0,父进程返回之进程ID,1个父进程可以fork很多子进程,父进程需记录每个子进程的ID,子进程通过getppid()得到父进程ID

    # threading 提供线程的各类操作
    # 实现多线程可通过2种方式
    # 方法1:继承Thread 通过start启动 并实现run方法
    # 方法2:实例化threading.Thread类,并将线程要执行的任务函数做为参数传给线程
    # start方法 启动线程并等待CPU调度 run方法 线程被CPU调度后自动执行的方法

    # 启动线程方法1 继承Thread
    class myThread(threading.Thread):
    def __init__(self,thread_name):
    super(myThread,self).__init__(name=thread_name)

    def run(self):
    print("%s线程正在运行中..."%self.name)


    def show(targs):
    time.sleep(1)
    print("thread"+str(targs)+" is running....")

    # 启动线程方法2 实例化threading.Thread类
    # threading.Thread(self, group=None, target=None, name=None,
    # args=(), kwargs=None, *, daemon=None)
    # group 用于扩展,target 可调用对象,在线程启动后执行
    # name 线程名字 默认为"Thread-N"
    # args 参数列表 kwargs 关键字参数 调用target时的参数
    # daemon 线程启动方式 前台还是后台,默认为False 即前台线程
    # daemon=False 前台线程:主线程执行过程中,前台线程也在执行,主线程执行完毕,等待前台线程执行完毕,程序才停止
    # daemon=True 后台线程:主线程执行过程中,后台线程也在执行,主线程执行完毕,后台线程不论执行是否结束,程序也会停止

    # 如果希望主线程等待子线程执行完毕后,程序才结束
    # 可通过将子线程加入到主线程中 如,使用join方法,或者设置子线程为主现成的守护线程 setDaemon(True)

    # 程序执行时,主线程执行完毕,再等待子线程执行完后,程序才执行完毕

    # 多核CPU用多进程 多进程的执行效率高于多线程
    # CPU密集型任务使用多进程 IO密集型任务使用多线程

    # join方式 在线程启动后,设置 将子线程加入 主线程 join()
    def doWaiting():
    print('start waiting:', time.strftime('%H:%M:%S'))
    time.sleep(3)
    print('stop waiting', time.strftime('%H:%M:%S'))

    t = threading.Thread(target=doWaiting)
    t.start()
    # 确保线程t已经启动

    time.sleep(1)
    print('start join')
    # 将一直堵塞,直到t运行结束。
    t.join()
    print('end join')

    # setDaemon方式 线程启动前,设置setDaemon=True
    def thread_fun():
    print(threading.current_thread().getName(),"开始工作")
    time.sleep(2)
    print("子线程结束工作")

    for i in range(5):
    t=threading.Thread(target=thread_fun,)
    t.setDaemon(True)
    t.start()

    print("主线程开始")
    time.sleep(2)
    print("主线程结束")

    # 活跃线程数
    print(threading.active_count())

    # daemon方式 线程启动前,设置daemon=False
    def thread_fun():
    print(threading.current_thread().getName(),"开始工作")
    time.sleep(2)
    print("子线程结束工作")

    for i in range(5):
    t=threading.Thread(target=thread_fun,daemon=False)
    t.start()

    print("主线程开始")
    time.sleep(2)
    print("主线程结束")

    # 活跃线程数
    print(threading.active_count())

    if __name__=='__main__':
    for i in range(5):
    # 方法1
    myThread("thread-"+str(i)).start()

    # 方法2
    t=threading.Thread(target=show,args=(i,))
    t.start()
  • 相关阅读:
    Handler使用入门 下载文件
    基于QT前端的mplayer播放器2
    HTTP协议详解(真的很经典)
    安装 gentoo minimal cd
    linux 分区方案
    MFC 中添加按钮和事件
    makefile 学习
    堆和栈
    paste命令使用
    cut用法
  • 原文地址:https://www.cnblogs.com/NiceTime/p/10092100.html
Copyright © 2011-2022 走看看