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()

 

posted @ 2017-11-07 19:47  不知所以  阅读(109)  评论(0)    收藏  举报