一、进程
进程:就是一个程序在一个数据集上的一次动态执行过程。
进程由三部分组成:
1、程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成
2、数据集:数据集则是程序在执行过程中所需要使用的资源
3、进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感
知进程存在的唯一标志。
二、线程
Threading用于提供线程相关的操作。线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位。一
条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
示例1:实现线程并发
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author: nulige 4 5 import threading #线程 6 import time 7 8 def Hi(num): #有一个参数 9 print("hello %s" %num) 10 time.sleep(3) 11 12 if __name__ == ‘__main__‘: 13 14 t1=threading.Thread(target=Hi,args=(10,)) #创建了一个线程对象t1,10做为一个参数,传给num 15 t1.start() 16 17 t2=threading.Thread(target=Hi,args=(9,)) #创建了一个线程对象t2,9做为一个参数,传给num 18 t2.start() 19 20 print("ending.........") #主线程输出ending
执行结果:
1 hello 10 #子线程 2 hello 9 #子线程 3 ending......... #主线程 4 #上面三个同时出来,再停顿三秒才结束 5 Process finished with exit code 0 #停顿3秒才结束
示例2:实现线程并发
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author: nulige 4 5 import threading 6 import time 7 8 def music(): 9 print("begin to listen %s"%time.ctime()) 10 time.sleep(3) 11 print("stop to listen %s" %time.ctime()) 12 13 def game(): 14 print("begin to play game %s"%time.ctime()) 15 time.sleep(5) 16 print("stop to play game %s" %time.ctime()) 17 18 if __name__ == ‘__main__‘: 19 20 t1=threading.Thread(target=music) 21 t1.start() 22 t2=threading.Thread(target=game) 23 t2.start()
执行结果:
1 #总共花了5秒时间 2 3 begin to listen Sat Jan 14 12:34:43 2017 4 begin to play game Sat Jan 14 12:34:43 2017 #1、先打印2个 5 6 stop to listen Sat Jan 14 12:34:46 2017 #2、等待3秒再打印一个 7 8 stop to play game Sat Jan 14 12:34:48 2017 #3、再等待2秒,打印一个
示例2: 使用join方法
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author: nulige 4 5 import threading 6 import time 7 8 def music(): 9 print("begin to listen %s"%time.ctime()) 10 time.sleep(3) 11 print("stop to listen %s" %time.ctime()) 12 13 def game(): #没有参数 14 print("begin to play game %s"%time.ctime()) 15 time.sleep(3) 16 print("stop to play game %s" %time.ctime()) 17 18 if __name__ == ‘__main__‘: 19 20 t1=threading.Thread(target=music) #生成一个线程实例 21 t2=threading.Thread(target=game) #再生成一个线程实例 22 23 t1.start() 24 t1.join() #等待 25 t2.start() 26 t2.join() 27 28 print("ending")
执行结果:
1 begin to listen Fri Jan 13 18:01:27 2017 #第1个出来 2 3 stop to listen Fri Jan 13 18:01:30 2017 4 begin to play game Fri Jan 13 18:01:30 2017 #这2个出来(两个同时出来) 5 6 stop to play game Fri Jan 13 18:01:33 2017 #第3个出来(两个同时出来) 7 ending
三、线程的两种调用方式
threading 模块建立在 thread 模块之上。thread 模块以低级、原始的方式来处理和控制线程,而 threading 模块通过对 thread
进行二次封装,提供了更方便的 api 来处理线程。
1、直接调用
pass
2、继承式调用
pass
四、 threading.thread的实例方法
1、join&Daemon方法
示例:
2、其它方法
示例:
四、进程与线程的关系区别
1、一个程序至少有一个进程,一个进程至少有一个线程.(进程可以理解成线程的容器)
2、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
3、线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和 程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
4、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调 度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程 自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是 它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
五、python的GIL
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once.This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features havegrownto depend on the guarantees that it enforces.) 上面的核心意思就是:无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行。 python的线程与threading模块
三、协程