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


欢迎关注 『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爬虫』 专栏,持续更新中
『未完待续』


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值