爬虫- Day7-多线程
-
1.什么是进程 - 一个正在运行的应用程序就是一个进程
每个进程均运行在其专门且受保护的内存空间中,当进程结束的时候,这个进程对应的内存空间会自动释放。
-
2.线程
线程是进程执行任务的基本单元。
进程中的任务都在线程中执行的(如果一个进程中没有线程,那么这个进程对应的程序什么事情都做不了)。进程 - 车间(工厂), 提供厂房以及厂房中保存资源
线程 - 车间工人
默认情况下,一个进程中有一个线程。 -
3.多线程 - 一个进程中有多个线程
单线程特点:一个线程执行多个任务,只能串行(一个一个按顺序)执行。
多线程特点:多个线程执行多个任务,可以并行(同时)执行。单线程 - 一个工厂中只有一个工人
多线程 - 一个工厂中同时有多个工人,多线程的存在可以提高程序的效率。手机应用程序:3 ~ 5线程
电脑应用程序:200 ~ 300个 -
4.多线程的原理
一个cpu同一时间只能处理一个线程,同一时间只有一个线程可以工作。
多线程的原理: 多线程技术其实就是利用CPU空闲时间做其他事情。 -
5.使用多线程
import time from datetime import datetime from threading import Thread, current_thread # 1. 主线程和子线程 # 一个进程默认只有一个线程,这个线程就是主线程,除了主线程以外的线程都是子线程。 # 子线程需要由程序员自己创建 # 什么时候需要子线程,什么时候就创建线程对象: Thread - 线程类 def download(name): print(f'======{name}开始下载:{datetime.now()}======') print(current_thread()) time.sleep(2) print(f'======{name}下载结束:{datetime.now()}======') if __name__ == '__main__': # 方案1:在主线程中直接下载三个电影 # download('肖申克的救赎') # download('霸王别姬') # download('阿甘正传') # 方案2:在三个子线程中分别下载三个电影 # 1)创建线程对象: Thread(*,target=函数, args=元组) # target: 需要在子线程中执行的任务(以函数的形式提供) # args: 元组中的元素就是在调用target对应的函数的时候的实参 t1 = Thread(target=download, args=('肖申克的救赎',)) t2 = Thread(target=download, args=('霸王别姬',)) t3 = Thread(target=download, args=('阿甘正传',)) # 2)启动线程 - 在子线程中调用target对应的函数,参数就传args中的数据 # 线程对象.start() t1.start() t2.start() t3.start()
-
6.阻塞
# 练习:同时下载20部电影,电影1、电影2、电影3,....、电影20,要求所有电影都下载结束后打印 '全部下载完成!' ts = [] for x in range(1, 21): name = f'电影{x}' t = Thread(target=download, args=(name,)) t.start() ts.append(t) for t in ts: t.join() print('全部下载完成!')