首页 > 系统相关 >记一次协程|线程|进程学习记录

记一次协程|线程|进程学习记录

时间:2024-01-04 12:03:16浏览次数:35  
标签:协程 img get print 线程 time 进程 async contents


本章仅以获取图片来测试一下Py的同步、异步、协程、多进程、多线程的速度。凑个热闹即可,具体需要以实际情况为主。

图片数量:257张

记一次协程|线程|进程学习记录_学习

执行操作:
1、读取文件
2、发起请求
3、下载图片

所需库:
pip install httpx
pip install aiomultiprocess
pip install aiofiles
pip install requests

同步



记一次协程|线程|进程学习记录_python_02

def get_img():
    with open('imgs', 'r', encoding='utf-8') as r:
            contents = r.read()
    # print(contents.split('\n'))
    for href in contents.split('\n'):
        img = requests.get(href).content
        with open('img/' + href[-28:-16] + '.jpg', 'wb') as w:
            w.write(img)
        print("加载成功", href)
#
start_time = timeit.default_timer()
get_img()
end_time = timeit.default_timer()
elapsed_time = end_time - start_time
print("Elapsed Time:", elapsed_time)

协程



记一次协程|线程|进程学习记录_sed_03

import asyncio
import aiofiles
import httpx
import timeit

async def read_img():
    # 异步读取
    async with aiofiles.open('imgs', 'r', encoding='utf-8') as r:
        contents = await r.read()
        return contents.split('\n')


async def download_image(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.content

async def get_image():
    contents = await read_img()
    tasks= [url for url in contents]
    for task in tasks:
        image_content = await download_image(task)
        try:
            async with aiofiles.open('img/' + task[-28:-16] + '.jpg', 'wb') as f:
                await f.write(image_content)
                print("加载成功~ {}".format(task))
        except:
            print("有点小问题,跳过")

if __name__ == '__main__':
    start_time = timeit.default_timer()
    asyncio.run(get_image())
    end_time = timeit.default_timer()
    elapsed_time = end_time - start_time

    print("Elapsed Time:", elapsed_time)

用到了一些其他模块,需要pip下载,按照上述指示下载即可。


就不一一举例的,具体的已经都放在了笔记中



记一次协程|线程|进程学习记录_多线程_04

直接来看看效果

异步



记一次协程|线程|进程学习记录_学习_05

多进程 + 异步



记一次协程|线程|进程学习记录_多线程_06

多线程 + 异步



记一次协程|线程|进程学习记录_学习_07

多线程



记一次协程|线程|进程学习记录_多线程_08

总结

为什么多线程在这里要更快??
为什么多进程 + 异步也慢??

这是一个先对问题,为什么这么说?跟数据量有关系,不能因为表面而被迷惑。因为协程跟进程是需要额外开销的,在程序启动的时候,这个开销在数据量小的时候尤其明显。(非官方解释,可参考博主的笔记)

标签:协程,img,get,print,线程,time,进程,async,contents
From: https://blog.51cto.com/qingan/9098433

相关文章

  • 深入分析 Java、Kotlin、Go 的线程和协程
    文章目录前言协程是什么协程的好处进程进程是什么进程组成进程特征线程线程是什么线程组成任务调度进程与线程的区别线程的实现模型一对一模型多对一模型多对多模型线程的“并发”协程协程的目的协程的特点协程的原理Java、Kotlin、Go的线程与协程Kotlin的协程使用「线程」的代......
  • QProgressDialog用法及结合QThread用法,四种线程使用
    1QProgressDialog概述QProgressDialog类提供耗时操作的进度条。进度对话框用于向用户指示操作将花费多长时间,并演示应用程序没有冻结。此外,QPorgressDialog还可以给用户一个中止操作的机会。进度对话框的一个常见问题是很难知道何时使用它们;操作在不同的硬件上花费不同的时间......
  • 文档型数据库的发展进程
    随着信息技术的不断发展,数据库在企业信息化建设中扮演着关键的角色。MongoDB作为国外主流的文档型数据库,一直以来在国际市场中广受欢迎。近年来,随着数字化转型的深入推进,中国数据库产业迅速崛起并取得了显著的进步。在这一发展潮流中,国产数据库正逐渐走进众多企业的应用领域。Mongo......
  • Windows系统进程svchost.exe在后台偷偷下载数据消耗流量
    手机开热点给电脑用,发现电脑网络很慢,用360流量防火墙检查流量情况,发现svchost.exe一直在偷偷搞我流量,整了1个多G,心痛。又是流氓东西。网上查了一下,svchost.exe是系统进程,还不能随便删除停用啥的,于是只能想办法禁止它使用网络。目前我的处理方法是在360流量防火墙上把svchost.exe的......
  • 多线程
    NSThreadNSThread是iOS和macOS中用于多线程编程的类。它封装了线程的创建和管理,允许开发者在后台执行任务而不阻塞主线程。这样可以保持应用界面的响应性,同时执行如下载文件、数据处理等耗时操作。使用NSThread的常用方法和属性:detachNewThreadSelector:toTarget:withObject......
  • 如何在PostgreSQL中管理锁定的表和进程
    在使用PostgreSQL数据库时,可能会遇到一种情况:某些进程锁定了特定的表,影响了数据库的正常操作。这时,了解如何查找并管理这些锁定进程是非常重要的。下面是一些步骤和注意事项,帮助您处理这种情况。步骤1:查找锁定的表和进程首先,您需要确定哪些进程正在锁定您关心的表。可以通过以下SQL......
  • 如何在Windows中终止占用特定端口的进程
    当您在Windows系统中遇到端口冲突或需要手动管理某些服务时,可能需要终止占用特定端口的进程。例如,如果您发现端口8072被占用,而您需要该端口来运行您的应用程序,您可以通过以下步骤来解决这个问题。步骤1:查找占用端口的进程首先,您需要打开命令提示符。这可以通过在开始菜单搜索“cmd......
  • Golang 协程配合管道
    请完成goroutine和channel协同工作的案例,具体要求:(1)开启一个writeData协程,向管道mtChan中写入50个整数.(2)开启一个readData协程,从管道intChan中读取writeData写入的数据。(3)注意:writeData和readDate操作的是同一个管道(4)主线程需要等待writeData和readDate协程都完成工作才能退出(如......
  • Bmwgroupdesignworks爬虫,网站作品信息多线程采集爬虫源码!
    一个比较简单国外设计站点,作品信息采集爬虫源码,比较简单,采集的内容包括标题、内容及图片信息,适合新人学习参考使用。网站作品信息采集中,关于图片的采集下载使用了重试以及多线程的方式爬取采集下载,适合Python爬虫新人练手使用和学习,如果你正在找练手网站,不妨尝试爬取下载数据。三......
  • 管道进行进程间通信(上)
    管道进行进程间通信在posix和systemV标准还没有出现的时候,进程间是如何进行通信的呢?这就要借助于我们今天学习的这个东西了。在进程间通信的标准没有出现之前,在os中就已经存在了文件了。而管道就是基于文件的一种进行进程间通信的方式。什么是管道首先一个文件是可以被一个进程打......