day9-进程与线程
一、概述
CPU: 负责指令操作 寄存器:存储上下文关系 线程:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,是一串指令的集合 进程:程序不能单独运行,只有装载到内存(CPU快于内存快于磁盘)中,系统为它分配资源才能运行,这种执行程序叫进程(通过PID区分),进程里面包含对资源调用、内存管理,网络接口调用等等 程序与进程:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 进程与线程: 1. 进程本身不能执行,要操作CPU,必须要先创建一个线程 2. 进程与线程哪个运行快没有可比性、线程寄生在进程中,起一个进程也是要起一个线程的;线程启动速度比进程快; 3. 线程共享内存空间,可以直接访问进程中的数据部分,同一进程的线程之间可以直接交流(数据共享、信息传递); 进程内存独立,数据部分由父进程拷贝而来,进程间通信需通过中间代理实现 4. 创建新线程很容易;创建新进程需要克隆父进程 5. 一个线程可以控制和操作同一进程里的其他线程;进程只能操作子进程 6. 对主线程的修改,由于共享数据的关系,可能会影响到进程中其他线程的修改;对一个父进程的修改不会影响其他子进程(只要不删除父进程即可) 7. 进程里面的第一个线程就是主线程,父线程和子线程是相互独立的,父线程只是创建了子线程,父线程挂了子线程不会受到影响
二、多线程实例
1. 直接调用
1 import threading 2 import time 3 4 5 def run(n): 6 print("task ", n, threading.current_thread()) 7 time.sleep(2) 8 print("task done ", n) 9 10 11 # ------------------------------ 12 # 串行 13 run("t1") 14 run("t2") 15 16 # ----------------------------- 17 # 并行 18 t1 = threading.Thread(target=run, args=("t1", )) 19 t2 = threading.Thread(target=run, args=("t2", )) 20 t1.start() 21 t2.start() 22 23 # ----------------------------- 24 # 多线程并发 25 start_time = time.time() 26 # 存线程实例 27 t_obj = [] 28 for i in range(20): 29 t = threading.Thread(target=run, args=(str(i), )) 30 # 把当前线程设置为守护线程,程序不会等待守护线程结束,必须在start之前设置 31 # 主线程down,守护进程也会down 32 # t.setDaemon(True) 33 t.start() 34 # 为了不阻塞后面线程的启动,不在这里join, 先把线程实例放到一个列表 35 t_obj.append(t) 36 37 print("----all threads has running...", threading.current_thread(), threading.active_count()) 38 # 主线程与子线程是并行的 39 # 循环线程实例列表,等待所有线程结束 40 for obj in t_obj: 41 obj.join() 42 43 # 计算运行时间,如果不加循环线程的join, 计算的是主线程的运行时间,加上计算的是所有线程的运行时间 44 print("cost: ", time.time() - start_time) 45 46 # 程序默认会等待所有非守护线程结束关闭
2. 继承式调用
1 # ----------------------------------- 2 # 继承式调用,一般不用 3 class MyThread(threading.Thread): 4 def __init__(self, n): 5 super(MyThread, self).__init__() 6 self.n = n 7 8 def run(self): 9 print("run task", self.n) 10 time.sleep(2) 11 12 t1 = MyThread("1") 13 t2 = MyThread("2") 14 t1.start() 15 t2.start()

浙公网安备 33010602011771号