python基础 二十四 进程 和 线程
进程 线程
操作系统
为什么要有操作系统?
操作系统:操作系统是一个用来协调,管理和控制计算机硬件和软件资源的系统程序。位于底层硬件与应用软件之间
工作方式:向下管理硬件 向上提供接口
切换
1.出现IO时切换
2.固定时间切换
进程
定义: 进程就是一个程序在一个数据集上的一次动态执行过程。
组成: 进程一般由程序、数据集、进程控制块三部分组成。
程序: 我们编写的程序用来描述进程要完成哪些功能以及如何完成;
数据集: 则是程序在执行过程中所需要使用的资源;
进程控制块: 用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
线程
线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元
组成:由线程ID、程序计数器、寄存器集合和堆栈共同组成。
线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源。
进程与线程的关系
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)CPU分给线程,即真正在CPU上运行的是线程。
并行和并发
并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。 指系统具有处理多个任务(动作)的能力
并发处理(concurrency Processing) 指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行 是指系统具有同时处理多个任务(动作)的能力
同步与异步
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。举个例子,打电话时就是同步通信,发短息时就是异步通信。
线程对象的创建 threading模块
Thread类直接创建
1 import threading
2 import time
3
4 def countNum(n): # 定义某个线程要运行的函数
5 print("running on number:%s" %n)
6 time.sleep(3)
7
8 if __name__ == '__main__':
9
10 t1 = threading.Thread(target=countNum,args=(23,)) #创建一个线程对象
11 t2 = threading.Thread(target=countNum,args=(34,))
12
13 t1.start() #启动线程
14 t2.start()
15
16 print("ending!")
1 import threading
2 import time
3
4 def Music(name):
5
6 print ("Begin {name}. {time}".format(name=name,time=time.ctime()))
7 time.sleep(3)
8 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
9
10 def Blog(name):
11 print("Begin {name}. {time}".format(name=name, time=time.ctime()))
12 time.sleep(5)
13 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
14
15 t1 = threading.Thread(target=Music,args=('Alex',))
16 t2 = threading.Thread(target=Blog,args=('egon',))
17
18 t1.start()
19 t2.start()
20
21 t1.join()
22 t2.join()
23
24 print("end....")
25
26
27 -----------------执行结果---------------
28
29 Begin Alex. Mon May 8 16:10:24 2017
30 Begin egon. Mon May 8 16:10:24 2017
31 Ending Alex. Mon May 8 16:10:27 2017
32 Ending egon. Mon May 8 16:10:29 2017
33 end....
34
35 --------------------------------------------------------------------------
36
37 import threading
38 import time
39
40 def Music(name):
41
42 print ("Begin {name}. {time}".format(name=name,time=time.ctime()))
43 time.sleep(3)
44 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
45
46 def Blog(name):
47 print("Begin {name}. {time}".format(name=name, time=time.ctime()))
48 time.sleep(5)
49 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
50
51 t1 = threading.Thread(target=Music,args=('Alex',))
52 t2 = threading.Thread(target=Blog,args=('egon',))
53
54 t1.start()
55 t2.start()
56
57 t1.join()
58
59
60 print("end....")
61
62 -----------------执行结果---------------
63
64 Begin Alex. Mon May 8 16:13:18 2017
65 Begin egon. Mon May 8 16:13:18 2017
66 Ending Alex. Mon May 8 16:13:21 2017
67 end....
68 Ending egon. Mon May 8 16:13:23 2017
69
70 join():在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
1 import threading
2 import time
3
4 def Music(name):
5
6 print ("Begin {name}. {time}".format(name=name,time=time.ctime()))
7 time.sleep(3)
8 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
9
10 def Blog(name):
11 print("Begin {name}. {time}".format(name=name, time=time.ctime()))
12 time.sleep(5)
13 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
14
15 threads = []
16
17 t1 = threading.Thread(target=Music,args=('Alex',))
18 t2 = threading.Thread(target=Blog,args=('egon',))
19
20 threads.append(t1)
21 threads.append(t2)
22
23 if __name__ == '__main__':
24
25 for t in threads:
26 t.setDaemon(True) #两个都设置为守护,不用管守护
27 t.start()
28 print("end..")
29
30 ---------------------执行结果------------------
31 Begin Alex. Mon May 8 16:37:57 2017
32 Begin egon. Mon May 8 16:37:57 2017
33 end..
34
35
36
37 -----------------------------------------------------------------
38
39 import threading
40 import time
41
42 def Music(name):
43
44 print ("Begin {name}. {time}".format(name=name,time=time.ctime()))
45 time.sleep(3)
46 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
47
48 def Blog(name):
49 print("Begin {name}. {time}".format(name=name, time=time.ctime()))
50 time.sleep(5)
51 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
52
53 threads = []
54
55 t1 = threading.Thread(target=Music,args=('Alex',))
56 t2 = threading.Thread(target=Blog,args=('egon',))
57
58 threads.append(t1)
59 threads.append(t2)
60
61 if __name__ == '__main__':
62
63 t1.setDaemon(True) #t1设置为守护,不用管t1,当t2退出时,程序退出
64 for t in threads:
65 t.start()
66 print("end..")
67
68 ---------------------执行结果------------------
69
70 Begin Alex. Mon May 8 16:57:45 2017
71 Begin egon. Mon May 8 16:57:45 2017
72 end..
73 Ending Alex. Mon May 8 16:57:48 2017
74 Ending egon. Mon May 8 16:57:50 2017
75
76
77
78
79 --------------------------------------------------
80 import threading
81 import time
82
83 def Music(name):
84
85 print ("Begin {name}. {time}".format(name=name,time=time.ctime()))
86 time.sleep(3)
87 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
88
89 def Blog(name):
90 print("Begin {name}. {time}".format(name=name, time=time.ctime()))
91 time.sleep(5)
92 print("Ending {name}. {time}".format(name=name, time=time.ctime()))
93
