进程:
1个正在运行的应用程序。一定是运行状态
1.进程之间相互独立
2.运行在专用的受保护的内存空间内(运行内存,内存条的大小),运行结束,内存释放
线程
一个进程想要执行任务,必须要有至少一条线程,即主线程(进程里的任务都是在线程里面执行的)。
1.一个线程中任务的执行是串行的。(一个线程中执行多个任务,只能一个一个按顺序执行)
多线程
1.每个进程里面可以拥有多条线程,并且,每条线程可以并行,执行不同的任务。
多线程原理
1.同一时间里,CPU只能处理1条线程
2.多线程并发时,CPU快速地在多条线程之间调度(切换),所以任务同时执行是假象
3.cpu充分利用自己的空闲时间,提高程序的执行效率。
思考:如果线程非常多,线程大小相差大,cpu在多个线程间切换,来回调度,CPU会累死。
手机2-3条,电脑几百条,多核,虽然多核技术实现,但是实际只有单核在运行,其他在玩,ios系统里面的GCD多线程技术最好,可以更多的利用内核
单线程,如果其中某个阻塞,那就选择多线程,把某个分开,节约时间
1.多线程
1.主线程
每个进程都默认会有一个线程,我们称之为主线程。
默认情况下,所有的程序代码都是在主线程中执行的。
2.子线程
所有的应用程序都支持子线程的,除开主线程,其他的线程需要手动的添加
3.threading
a.线程有个类,Thread类的对象就是线程对象,需要线程的时候,就创建这个类,或者这个类的子类对象
b.threading currentThread(),用来获取当前的线程对象
import threading
print('主线程中的代码')
print(threading.currentThread())
import datetime
import time
print('============')
#创建子线程对象
# 下载两个电影
def download(file):
print(threading.currentThread())
print('开始下载:'+file,datetime.datetime.now())
#让线程阻塞5秒
time.sleep(5)
print('结束下载:'+file,datetime.datetime.now())
# 1.均在主线程
# download('南极')
# download('北极')
"""
Thread(target,args)
target:需要在子线程中调用的函数名
args:函数的实参
返回值:创建好的线程对象
"""
t1=threading.Thread(target=download,args=('南极',))
#开始执行t1对应的线程中的任务
t1.start()
t2=threading.Thread(target=download,args=('北极',))
#开始执行t1对应的线程中的任务
#想要在子线程中执行任务,必须通过线程对象调用start方法才行
t2.start()
print('============')
2.面向对象的多线程
"""
面向对象实现多线程
1.声明一个类,继承Thread类
2.将需要在子线程中执行的任务放到run方法中,相当于是重写run 方法
3.在需要子线程的地方去创建这个类的对象,然后用对象来调用start方法,去执行run中的任务
from threading import Thread
import datetime
import time
class Download(Thread):
def __init__(self,file):
super().__init__()
self.name=file
def run(self):
print('开始下载'+self.name,datetime.datetime.now())
time.sleep(5)
print('结束下载'+self.name,datetime.datetime.now())
if __name__ == '__main__':
print('==========')
t1=Download('中国')
# t1.run()在主线程执行
t1.start()#在子线程执行
print('+++++++++++')
# 在两个子线程中下载两部电影,在主线程中统计两部电影下载总的时间
"""
如果希望某个线程结束后才执行某个操作,就用那个线程调用join方法
"""
import time
from threading import Thread
from datetime import datetime
from random import randint
class Download(Thread):
def __init__(self,file):
super().__init__()
self.file=file
def run(self):
print('开始下载:'+self.file,datetime.now())
time.sleep(randint(5,15))
print('下载结束:'+self.file,datetime.now())
if __name__ == '__main__':
t1=Download('北极')
t2=Download('南极')
start=time.time()
t1.start()
t2.start()
#希望得到t2刚好结束的时间
t1.join()#这句代码后面的代码在t1对应的线程结束后才执行
t2.join()
end=time.time()
print(end-start)