线程和进程特性
并发和并型
并发:指系统具有处理多个任务(动作)的能力,一般结合硬件多核心处理
并行:并发的子集,具有同时处理多个任务(动作)的能力
同步与异步
同步:当进程执行到一个IO操作(等待外部数据),一同执行,就是同步
异步:当进程执行到一个IO操作(不等待外部数据),不管其他线程继续执行
线程 threading
定义
最小的执行单位,进程里边的虚拟微进程。
一个进程至少有一个线程
一个线程可以创建和撤销另外一个线程
同一个进程间的多个线程----并发执行
基本方法
方法 | 释义 |
---|---|
start() | 启动线程 |
isAlive() | 返回线程是否活动 |
setName() | 定义线程名称 |
getName() | 返回线程名称 |
jion() | 等待线程 |
setDeamon() | 守护线程 |
start()
新开启动线程
import time
import threading #线程模块
def HI(num):
print("hello %s" %num)
time.sleep(3)
if __name__ == '__main__':
t1 = threading.Thread(target=HI, args=(10,)) #创建一个子线程【固定格式】
t2 = threading.Thread(target=HI, args=(9,)) #创建一个子线程【固定格式】
t1.start() #执行线程
t2.start() #执行线程
print("end")
hello 10
hello 9
end
多线程示例
import time
import threading #线程模块
def APP1():
print("第一个应用 【开始时间】 %s" %time.ctime())
time.sleep(3)
print("第一个应用 【结束时间】 %s" % time.ctime())
def APP2():
print("第二个应用 【开始时间】 %s" %time.ctime())
time.sleep(5)
print("第二个应用 【结束时间】 %s" % time.ctime())
if __name__ == '__main__':
t1 = threading.Thread(target=APP1) #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2) #创建一个子线程对象【固定格式】
print("主线程") #测试主线程和其它一起执行
t1.start()
t2.start()
主线程
第一个应用 【开始时间】 Sun Jun 3 15:08:07 2018
第二个应用 【开始时间】 Sun Jun 3 15:08:07 2018
第一个应用 【结束时间】 Sun Jun 3 15:08:10 2018
第二个应用 【结束时间】 Sun Jun 3 15:08:12 2018
列表整合多线程示例
import time
import threading #线程模块
def APP1():
print("第一个应用 【开始时间】 %s" %time.ctime())
time.sleep(3)
print("第一个应用 【结束时间】 %s" % time.ctime())
def APP2():
print("第二个应用 【开始时间】 %s" %time.ctime())
time.sleep(5)
print("第二个应用 【结束时间】 %s" % time.ctime())
t1 = threading.Thread(target=APP1) #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2) #创建一个子线程对象【固定格式】
th_list = [] #建立空列表用于整合所有线程
th_list.append(t1) #添加线程【t1】到列表中
th_list.append(t2) #添加线程【t2】到列表中
print("主线程") #测试主线程和其它一起执行
if __name__ == '__main__':
for i in th_list: #遍历列表中的所有线程
i.start() #执行线程
主线程
第一个应用 【开始时间】 Sun Jun 3 15:08:07 2018
第二个应用 【开始时间】 Sun Jun 3 15:08:07 2018
第一个应用 【结束时间】 Sun Jun 3 15:08:10 2018
第二个应用 【结束时间】 Sun Jun 3 15:08:12 2018
join()
等待进程 - 定义特定进程结束再继续执行程序代码【实现同步】
import time
import threading #线程模块
def APP1():
print("第一个应用 【开始时间】 %s" %time.ctime())
time.sleep(3)
print("第一个应用 【结束时间】 %s" % time.ctime())
def APP2():
print("第二个应用 【开始时间】 %s" %time.ctime())
time.sleep(5)
print("第二个应用 【结束时间】 %s" % time.ctime())
if __name__ == '__main__':
t1 = threading.Thread(target=APP1) #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2) #创建一个子线程对象【固定格式】
t1.start()
t2.start()
t1.join() #定义等待【t1】进程结束再执行以下程序代码
t2.join() #定义等待【t2】进程结束再执行以下程序代码
print("主线程")
第一个应用 【开始时间】 Sun Jun 3 15:12:56 2018
第二个应用 【开始时间】 Sun Jun 3 15:12:56 2018
第一个应用 【结束时间】 Sun Jun 3 15:12:59 2018
第二个应用 【结束时间】 Sun Jun 3 15:13:01 2018
主线程
列表实现同步进程示例
import time
import threading #线程模块
def APP1():
print("第一个应用 【开始时间】 %s" %time.ctime())
time.sleep(3)
print("第一个应用 【结束时间】 %s" % time.ctime())
def APP2():
print("第二个应用 【开始时间】 %s" %time.ctime())
time.sleep(5)
print("第二个应用 【结束时间】 %s" % time.ctime())
t1 = threading.Thread(target=APP1) #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2) #创建一个子线程对象【固定格式】
th_list = [] #建立空列表用于整合所有线程
th_list.append(t1) #添加线程【t1】到列表中
th_list.append(t2) #添加线程【t2】到列表中
if __name__ == '__main__':
for i in th_list: #遍历列表中的所有线程
i.start() #执行线程
for l in th_list:
l.join()
print("主线程") #测试主线程和其它一起执行
第一个应用 【开始时间】 Sun Jun 3 15:12:56 2018
第二个应用 【开始时间】 Sun Jun 3 15:12:56 2018
第一个应用 【结束时间】 Sun Jun 3 15:12:59 2018
第二个应用 【结束时间】 Sun Jun 3 15:13:01 2018
主线程
setDeamon(True)
守护进程 - 和主线程一起结束
==注:当setDeamon状态【True】和【Flase】一同存在【Flase】生效==
import time
import threading #线程模块
def APP1():
print("第一个应用 【开始时间】 %s" %time.ctime())
time.sleep(3)
print("第一个应用 【结束时间】 %s" % time.ctime())
def APP2():
print("第二个应用 【开始时间】 %s" %time.ctime())
time.sleep(5)
print("第二个应用 【结束时间】 %s" % time.ctime())
if __name__ == '__main__':
t1 = threading.Thread(target=APP1) #创建一个子线程对象【固定格式】
t2 = threading.Thread(target=APP2) #创建一个子线程对象【固定格式】
t2.setDaemon(True) #守护第二个线程,主线程结束,第二个应用一同结束
t1.start()
t2.start()
print("主线程")
第一个应用 【开始时间】 Sun Jun 3 15:36:13 2018
第二个应用 【开始时间】 Sun Jun 3 15:36:13 2018
主线程
第一个应用 【结束时间】 Sun Jun 3 15:36:16 2018