一.进程和线程的意义
1.进程: 正在执行的程序
特点: 相互独立 占用受保护独立的内存单元
2.线程: 进程想要执行任务,必须的有线程
一个进程的所有认为都是在线程中进行的
特点: 串行(一个一个按顺序去执行任务)
3.多线程
特点: 并行(每条线程可以同时执行不同的任务)
原理:
1.同一时间,cpu只能处理一条线程, 只有一条线程在工作.
2.多线程并发执行,其实是cpu在快速地在多线程之间调度.
3.cpu调度线程的时间足够快,造成了多线程并发的假象.
二.耗时操作
一个进程默认有一个线程,这个线程叫主线程.
默认情况下, 所有的代码都是在主线程里面进行的.
import time, datetime.
def down_load(film_name):
print('开始下载%s' % film_name, '开始时间:%s' % datetime.datetime.now())
time.sleep(5) # 程序执行到这个地方,线程会阻塞5秒,再执行后面膜的代码
print('%s 下载结束' % film_name,'结束时间:%s' % datetime.datetime.now())
if __name__ == '__main__':
down_load('小黄人')
down_load('地心历险记')
三.多线程方法1:通过Thread类创建子线程
python通过threading模块
默认创建的线程叫主线程, 自己创建的线程叫子线程
如果希望代码在子线程里面执行,必须手动创建子线程对象
import threading
import time, datetime
def down_load(film_name):
print('开始下载%s' % film_name, '开始时间:%s' % datetime.datetime.now())
time.sleep(5) # 程序执行到这个地方,线程会阻塞5秒,再执行后面膜的代码
print('%s 下载结束' % film_name,'结束时间:%s' % datetime.datetime.now())
print('下载%s' % film_name, threading.current_thread())
if __name__ == '__main__':
# down_load('小黄人')
# 1.创建线程对象
"""
Thread - 线程类
Thread(target=函数名, args=参数列表) - 直接创建线程对象
函数名 = 需要在当前线程执行的函数变量
参数列表(要求是元组) = 元祖, 元祖的元素是函数的参数
"""
t1 = threading.Thread(target=down_load, args=('小黄人',))
t2 = threading.Thread(target=down_load, args=('小绿人',))
# 2. 在子线程中执行任务
"""
这里是调用down_load函数,并且传递一个参数'小黄人'
"""
t1.start()
t2.start()
四.多线程方法2: 通过Thread的子类创建子线程.
import datetime, time, threading
"""
除了直接创建Thread的对象,还可以继承这个类的对象
注意: 一个进程中有多个线程,进程会在所有的线程都结束才会结束
线程中的任务执行完了,线程就结束
"""
class Thread1(threading.Thread):
def __init__(self, film_name):
super().__init__()
self.film_name = film_name
# 2.重写run方法
def run(self):
print('开始下载%s' % self.film_name , '开始时间:%s' % datetime.datetime.now())
time.sleep(5) # 程序执行到这个地方,线程会阻塞5秒,再执行后面膜的代码
print('%s 下载结束' % self.film_name , '结束时间:%s' % datetime.datetime.now())
print(threading.current_thread())
# 创建线程对象
t1 = Thread1('小黄人')
# 4.通过线程对象调用start在子线程重执行run方法
t1.start()
# 直接调用run方法会在主线程执行
五.join函数
"""
线程对象.join() - 等待线程对象中的任务执行完成
"""
from threading import Thread
import datetime, time, random
class DownLoad(Thread):
def __init__(self, film_name):
super().__init__()
self.film_name = film_name
def run(self):
print('开始下载%s'% self.film_name)
a = random.randint(5,12)
time.sleep(a)
print('下载结束%s' % self.film_name, '耗时%d秒'% a)
if __name__ == '__main__':
t1 = DownLoad('小黄人')
t2 = DownLoad('小绿人')
time1 = time.time()
t1.start()
t2.start()
# t1和t2的任务都执行完成后才会执行后面的代码
t1.join()
t2.join()
time2 = time.time()
print('总共时间:',str(time2 - time1) + '秒')