多线程和多进程

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 多线程和多进程相关推荐

  1. 爬虫day7多线程和多进程

    爬虫day7多线程和多进程 一.什么是线程和进程 1.什么是进程 一个正在运行的应用程序就是一个进程. 每一个进程均运行在其专用且受保护的内存(运行内容)中 2.什么是线程 线程是进程执行任务的基本单 ...

  2. 线程VS进程,多线程VS多进程,并行VS并发,单核cpuVS多核cpu

    目录 概论 进程VS线程 并发VS并行 多线程VS多进程 总结 概论 程序是为完成特定任务.用某种语言编写的组指令的集合.即指一段静态的代码,静态对象. 进程是程序的次执行过程, 或是正在运行的 一个 ...

  3. python多线程和多进程的使用_python多线程与多进程

    python多线程与多进程 python多线程 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来 ...

  4. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  5. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  6. gj11 多线程、多进程和线程池编程

    11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...

  7. 多线程还是多进程的选择

    我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受). 对比维度 多进程 多线程 总结 数据共享.同步 数据共享复杂, ...

  8. Python串行运算、并行运算、多线程、多进程对比实验

    Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心,关于这个,这里有篇文章),但是可以通过Python的multiprocessing(多进程)模块或者并行运算模块( ...

  9. 多线程还是多进程的选择及区别

    鱼还是熊掌:浅谈多进程多线程的选择 关于多进程和多线程,教科书上最经典的一句话是"进程是资源分配的最小单位,线程是CPU调度的最小单位",这句话应付考试基本上够了,但如果在工作中遇 ...

最新文章

  1. 40万总奖金!院士指导,顶级云服务免费用!2021全球高性能云计算创新大赛来了...
  2. hibernate延迟加载lazy的原理,以及为什么session关闭会报错
  3. 8种常见机器学习算法比较
  4. 遗传算法求最短路径(旅行商问题)python实现
  5. cpu不支持虚拟装linux,linux 查看cpu是不是支持虚拟化
  6. struts2中s:select标签在freemarker中的使用
  7. mysql 自定义函数之判断
  8. mysql 8服务配置文件my.ini 不生效_2、mysql的启动选项和配置文件介绍
  9. 分布式系统:SpringBoot中Dubbo以及Zookeeper依赖包冲突 LoggerFactory is not a Logback LoggerContext but Logback
  10. django filter查询多选_动态filter查询数据Django实现方法
  11. window.location和document.location的区别分析
  12. oracle技术之oracle备份恢复概述
  13. 无捆绑绿色安装金山打字通教程
  14. python如何设置当前工作路径?
  15. Google Analytics API V4(谷歌统计实战)
  16. R绘图基础指南 | 1.条形图
  17. TypeError: __init__() takes 1 positional argument but 2 were given
  18. html5青蛙过河,[推荐]===PS4上的本地多人游戏推荐心得===家庭聚会,欢乐时光 (持续更新)...
  19. 正则表达式前端使用手册
  20. 绝地求生+守望先锋?2019首款黑马游戏Apex英雄凭什么如此火爆?

热门文章

  1. 微型计算机c560,基于PLC的十字路口交通信号灯控制系统设计.doc
  2. 前途无忧-学费分期、招生就业服务平台
  3. 今日头条笔试第二题--文章病句标识
  4. 手动解析及数据链接地址
  5. ReactJs入门教程-精华版
  6. 【iTools】代码版本控制 git 流
  7. [转] 浅谈脱壳中的附加数据问题(overlay)
  8. nginx使用Proxy-protocal
  9. php检测目标服务器是否宕机_Docker卸载镜像
  10. 使用Google Earth Engine (GEE)实现MODIS数据批量下载