day7 多线程和多进程
多线程和多进程
01 . 什么是线程和进程
什么是进程 - 工厂
- 一个正在运行的应用程序就是一个进程。
- 每一个进程均运行在其钻用且受保护的内存(运行内存)中
什么是线程 - 工人
- 线程就是进程执行任务的基本单位,进程要做什么事情,必须要与线程。
线程的特点 - 串行
- 如果在一个线程中执行多个任务,任务是串行执行的(一个一个的按照顺序执行)
多线程
- 默认情况下,一个进程只有一个线程,多线程指的是在一个进程中有多个线程。
- 多线程执行不同的任务可以并行(同时)执行。
- 注意:多线程可以提高程序执行效率,但并不是越多越好(计算机一般的应用程序不要超过100个,爬虫可以达到200-300个)
02 . 多线程
主线程和子线程
一个进程默认只有一个线程,这个进程叫主线程。除了主线程以外的线程叫子线程。
如果进程中需要子线程,只能自己创建(创建线程类或者线程类的子类对象)
from threading import Thread,current_threadprint(current_thread()) # <_MainThread(MainThread, started 6448)>
单线程的串行
def download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(2)print(f'{name}开始结束:{datetime.now()}')download('123') download('456') download('789')
创建三个子线程,下载散步电影
创建线程对象,并且分配线程任务:Thread(*,target,args)
target - 需要在子线程中调用的函数,需要给一个普通函数的函数名(代表任务)。
args - 在子线程中调用target对应的函数的时候需要的参数对应的元组。如果需要一个实参,元组就给一个元素,如果需要两个实参,元组就给两个元素…
启动线程:线程对象 . start()
import time from threading import Thread,current_thread from datetime import datetime# print(current_thread())def download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(2)print(f'{name}开始结束:{datetime.now()}')# download('123') # download('456') # download('789')t = Thread(target=download,args=('123',)) t1 = Thread(target=download,args=('456',)) t2 = Thread(target=download,args=('789',))t.start() t1.start() t2.start()
03 . 图虫图片一步下载
from selenium.webdriver import Chrome
import time
from lxml import etree
from threading import Thread
import requests
import os
from datetime import datetimeb = Chrome()def download_image(url):print(f'开始下载.....:{datetime.now()}')res = requests.get(url)image_name = os.path.basename(url)open(f'files/{image_name}', 'wb').write(res.content)print(f'图片下载完成!{datetime.now()}')def get_html():# 1. 获取图片地址b.get('https://stock.tuchong.com/topic?topicId=50346')time.sleep(1)html = etree.HTML(b.page_source)result = html.xpath('//div[@class="justified-layout"]/div/div/@data-lazy-url')# 2. 下载图片print('==================开始下载===================')for img_url in result:t = Thread(target=download_image, args=('https:'+img_url,))t.start()if __name__ == '__main__':get_html()
04 . 线程阻塞
阻塞线程 - 等到某个线程的任务结束才接着执行
线程对象 . join()
import time from threading import Thread,current_thread from datetime import datetime from random import randintdef download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(randint(2,10))print(f'{name}下载结束:{datetime.now()}')t = Thread(target=download,args=('123',)) t1 = Thread(target=download,args=('456',)) t2 = Thread(target=download,args=('789',))# 需求1:等到电影全部下载完成(三个线程都结束)才开始打印 # t.start() # t1.start() # t2.start() # t.join() # t1.join() # t2.join() # print('=======电影全部下载完成========')# 需求2:第一个电影下载完成后才开始下载2、3个电影 t.start() t.join() t1.start() t2.start()=========================华丽的分割线=============================== names = ['肖申克的救赎', '触不可及', '头脑特工队', '恐怖游轮'] ts = [] for name in names:t = Thread(target=download, args=(name,))t.start()ts.append(t)for t in ts:t.join()# 要求: 所有电影都下载结束打印 '全部下载完成' print('=============全部下载完成=============')
05 . 多进程
多进程
- 一个应用程序默认只有一个进程(主进程),每一个进程中默认有一个线程(主线程)
- 一个程序可以有多个进程(除了主进程以外的进程叫子进程),任何一个进程中可以有多个线程
- 如果希望程序中有子进程,需要自己创建进程对象(创建的进程中都自带一个线程)
使用多进程
创建进程对象
启动进程
进程阻塞
def download(name):print(f'{name}开始下载:{datetime.now()}')time.sleep(2)print(f'{name}下载结束:{datetime.now()}')# 注意:如果想要使用多进程,必须在程序中添加这个if语句 if __name__ == '__main__':# 1)创建进程对象p1 = Process(target=download, args=('肖生克的救赎',))p2 = Process(target=download, args=('惊魂记',))p3 = Process(target=download, args=('7号房的礼物',))# 2)启动进程p1.start()p2.start()p3.start()# 3)进程阻塞p1.join()p2.join()p3.join()print('下载完成!')
day7 多线程和多进程相关推荐
- 爬虫day7多线程和多进程
爬虫day7多线程和多进程 一.什么是线程和进程 1.什么是进程 一个正在运行的应用程序就是一个进程. 每一个进程均运行在其专用且受保护的内存(运行内容)中 2.什么是线程 线程是进程执行任务的基本单 ...
- 线程VS进程,多线程VS多进程,并行VS并发,单核cpuVS多核cpu
目录 概论 进程VS线程 并发VS并行 多线程VS多进程 总结 概论 程序是为完成特定任务.用某种语言编写的组指令的集合.即指一段静态的代码,静态对象. 进程是程序的次执行过程, 或是正在运行的 一个 ...
- python多线程和多进程的使用_python多线程与多进程
python多线程与多进程 python多线程 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来 ...
- python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...
原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...
- python 多进程_说说Python多线程与多进程的区别?
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...
- gj11 多线程、多进程和线程池编程
11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...
- 多线程还是多进程的选择
我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受). 对比维度 多进程 多线程 总结 数据共享.同步 数据共享复杂, ...
- Python串行运算、并行运算、多线程、多进程对比实验
Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心,关于这个,这里有篇文章),但是可以通过Python的multiprocessing(多进程)模块或者并行运算模块( ...
- 多线程还是多进程的选择及区别
鱼还是熊掌:浅谈多进程多线程的选择 关于多进程和多线程,教科书上最经典的一句话是"进程是资源分配的最小单位,线程是CPU调度的最小单位",这句话应付考试基本上够了,但如果在工作中遇 ...
最新文章
- 40万总奖金!院士指导,顶级云服务免费用!2021全球高性能云计算创新大赛来了...
- hibernate延迟加载lazy的原理,以及为什么session关闭会报错
- 8种常见机器学习算法比较
- 遗传算法求最短路径(旅行商问题)python实现
- cpu不支持虚拟装linux,linux 查看cpu是不是支持虚拟化
- struts2中s:select标签在freemarker中的使用
- mysql 自定义函数之判断
- mysql 8服务配置文件my.ini 不生效_2、mysql的启动选项和配置文件介绍
- 分布式系统:SpringBoot中Dubbo以及Zookeeper依赖包冲突 LoggerFactory is not a Logback LoggerContext but Logback
- django filter查询多选_动态filter查询数据Django实现方法
- window.location和document.location的区别分析
- oracle技术之oracle备份恢复概述
- 无捆绑绿色安装金山打字通教程
- python如何设置当前工作路径?
- Google Analytics API V4(谷歌统计实战)
- R绘图基础指南 | 1.条形图
- TypeError: __init__() takes 1 positional argument but 2 were given
- html5青蛙过河,[推荐]===PS4上的本地多人游戏推荐心得===家庭聚会,欢乐时光 (持续更新)...
- 正则表达式前端使用手册
- 绝地求生+守望先锋?2019首款黑马游戏Apex英雄凭什么如此火爆?