# 进程:本质上就是一个程序在一个数据集上的一次动态执行过程(抽象的概念) # 进程一般由程序、数据集(程序运行过程中所需要使用的资源)、进程控制块(记录进程的外部特征,描述进程的执行变化过程)三部分组成 # 进程是最小的资源单位 # 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能# 线程:是最小的执行单位 # 进程与线程的联系与区别 # 1、一个程序至少有一个进程,一个进程至少有一个线程 (进程可以理解成线程的容器) # 2、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率 # 3、线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制、 # 4、进程是具有一定独立功能的程序关于某个数据集上的一次运行活动,里程是系统进行资源分配和调度的一个独立单位 # 5、线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是它可与同属一个进程的其它线程共享进程所拥有的全部资源 # 6、一个线线可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行 # threading线程模块 import threading, time def hi(num): print(‘hello world,‘, num) time.sleep(3) class MyThread(threading.Thread): # 自定义线程类 def __init__(self, num): # 初始化,获取num self.num = num def run(self): # 将hi函数体写入run()方法内,必须要重写run方法 print(‘hello world,‘, self.num) time.sleep(3) if __name__ == ‘__main__‘: t1 = threading.Thread(target=hi, args=(10,)) # 创建了一个线程对象,目标指向hi函数,args后是元组形式的参数 t2 = threading.Thread(target=hi, args=(9,)) t3 = MyThread(8) # 通过自定义的线程类创建t3线程对象,这种方式不常用 t1.start() # 启动t1线程 t1.join() # 在t1子线程完成之前,这个子线程的父线程将一直被阻塞 t2.setDaemon(True) # setDaemon(守护线程) 必须在start之前设置 # 当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就兵分两路分别运行 # 那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等子线程完成后再退出 # 但有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以使用setDaemon方法了 t2.start() print(t1.getName()) # Thread-1 print(threading.active_count()) # 2 print(threading.enumerate()) # [<_MainThread(MainThread, started 3672)>, <Thread(Thread-2, started daemon 11632)>] print(‘end...‘) # threading的其它方法 # run() 用以表示线程活动的方法 # start() 启动线程活动 # isAlive() 返回线程是否活动的 # getName() 返回线程名 # setName() 设置线程名 # threading模块提供的一些方法 # threading.currentThread() 返回当前的线程变量 # threading.enumerate() 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程 # threading.activeCount() 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
原文地址:https://www.cnblogs.com/dangrui0725/p/9495851.html
时间: 2024-10-07 01:02:33