『python爬虫』16. 多线程与多进程(保姆级图文)

news/2024/7/3 2:16:07

目录

  • 多线程
    • 1. 什么是多线程?
    • 2. 串行模式
    • 3. 多线程
      • 3.1 多线程方法写法
      • 3.2 多线程方法带参数
      • 3.3 多线程类写法
  • 多进程
    • 1. 什么是多进程


欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中

多线程

1. 什么是多线程?

不增加CPU数量的情况下同时执行多个线程的任务。
相比较于多进程没有多个CPU之间交换信息的损耗。


2. 串行模式

请注意!计算机中没有真正意义上的同时,只是因为执行多个任务时来回切换执行2个任务,让你觉得是同时。

下面的程序是先执行完 func() 的内容,然后执行main的循环,这是典型的串行工作。

def func():
    for i in range(1000):
        print("func", i)


if __name__ == '__main__':
    func()
    for i in range(1000):
        print("main", i)

在这里插入图片描述


3. 多线程

明显的发现多线程的情况下会出现输出混乱可能我们的fun输出晚fun还没有输出数字,但是main 数字此时已经输出了,造成了下面乱糟糟的情况。

3.1 多线程方法写法

from threading import Thread  # 线程类


def func():
    for i in range(1000):
        print("func", i)


if __name__ == '__main__':
    t = Thread(target=func)  # 创建线程并给线程安排任务
    t.start()  # 多线程状态为可以开始工作状态, 具体的执行时间由CPU决定

    for i in range(1000):
        print("main", i)

在这里插入图片描述

3.2 多线程方法带参数

传递args参数必须是元组;如果采用kwargs参数必须是字典键值对

from threading import Thread


def func(name):  # name参数
    for i in range(1000):
        print(name, i)


if __name__ == '__main__':
    t1 = Thread(target=func, kwargs={'name':'T1'})  # 传递参数必须是元组
    t1.start()

    t2 = Thread(target=func, args=("T2",))
    t2.start()

在这里插入图片描述

3.3 多线程类写法

如果要传参,需要在类中定义构造函数进行传参。

from threading import Thread  # 线程类


class MyThread(Thread):  #
	
    def run(self):  # 固定的    -> 当线程被执行的时候, 被执行的就是run()
        for i in range(1000):
            print("子线程", i)
    

if __name__ == '__main__':
    t = MyThread()
    # t.run()  # 方法的调用了. -> 单线程????
    t.start()  # 开启线程

    for i in range(1000):
        print("主线程", i)

多进程

1. 什么是多进程

多个CPU执行任务,不会像多线程一样有实际有效线程数量的限制,理论上CPU越多性能越强大。
多个CPU合作执行,CPU之间的信息交换带来比较大的效率损失。


## 2. 多进程
from multiprocessing import Process
from threading import Thread

def func():
    for i in range(1000):
        print("子进程", i)


if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    for i in range(1000):
        print("主进程", i)

上面代码你可能会得到一个好像是串行运行的结果,这是因为执行速度太快了,加入延时你会看的更清楚直观

import time
from multiprocessing import Process

def func():
    for i in range(5):
        print("子进程", i)
        time.sleep(1)# 增加延迟,如果不加延迟的话,可能因为多个CPU快速的执行导致,看上去的效果像是串行执行(1整个CPU执行比较快)



if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    for i in range(5):
        print("主进程", i)
        time.sleep(1)

在这里插入图片描述


## 总结 大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中
『未完待续』



http://lihuaxi.xjx100.cn/news/1115771.html

相关文章

优化营商环境:打造政策精准服务平台,提高惠政策落实落地时效性

近年来,各级政府部门及产业园区不断加强对于惠企政策的宣传和落实,努力打造优质的营商环境,加大助企纾困力度,以推动经济高质量发展。为了更好地实现这一目标,搭建惠企政策精准服务平台成为了一个非常重要的举措。 搭建…

计算机毕业论文选题推荐|软件工程|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)门窗账务管理系…

芒果用户未来价值预估 baseline学习

背景 我们从三个层面定义用户未来价值。 用户N日留存分用户N日观看视频次数用户N日观看视频的总时长 以七日作为未来时间窗口: 1.一个用户的7日留存分等于3,代表这个用户未来的7天里,有3天会访问芒果TV。 2.一个用户未来7天观看了20次视频…

鉴权C# HmacSHA256加密与java HmacSHA256一致

public static string HmacSHA256Encrypt(string secret, string signKey) {   string signRet string.Empty;   using (HMACSHA256 mac new HMACSHA256(Encoding.UTF8.GetBytes(secret)))   {     mac.Initialize();     byte[] hash mac.ComputeHash(Encodi…

OpenPCDet系列 | 3.OpenPCDet点云检测框架训练准备流程

文章目录 训练准备流程1. dataloader部分2. network部分3. optimizer部分4. scheduler部分训练准备流程 对于OpenPCDet中模型的训练过程如下所示,在训练前一般需要进行4个部分的准备:数据准备、网络模型准备、以及优化器和学习率调度器。下面对这4个大部分分别介绍。主要就是…

程序设计入门——C语言 2023年5月9日

程序设计入门——C语言 一、基础理解1、什么是计算机?如何用计算机做事情?什么是应用软件?编程语言干啥的?计算机与人脑?学习编程能干啥?2、计算机-程序-算法3、解释语言vs编译语言 课程来源:链…

SpringBoot——入门程序的简单介绍

简单介绍: 在之前我们创建了一个基础的SpringBoot的程序,可以看到,我们只是启动了一个Java程序,但是它启动了一个Tomcat的服务器。其实在这里面他还启动了很多的服务,只不过这些服务我们都没有用到,我们就…

UNIAPP实战项目笔记63 当前用户查询收货地址的前后端实现

UNIAPP实战项目笔记63 当前用户查询收货地址的前后端实现 总体思路 当前登陆的时候收货地址( token ) header:{ token:true } 前端: 后端: 1.设计数据库(新建一个收货地址表) 收货地址表,需要和user表关联 [字段:用户id] 2.创建一个接口 查询收货地址接口文档 1.1 接口功能 …