当前位置:首页 > 技术分析 > 正文内容

Python之高性能多任务编程概述(python 多任务并行处理)

ruisui883个月前 (02-03)技术分析15

本文是关于python高性能多任务编程的总结与概括。有很多细节没有详述,有需要了解更多的可以关注我,看看我前几期的文章。

一、选择操作系统

高性能多任务编程需要选择合适的操作系统。因为windows下创建子进程是通过重新加载py程序文件;而linux和mac创建子进程是通过复制父进程的内存空间,所以在windows平台下运行多进程python程序的效率远不如在linux和mac平台下运行。要追求高性能多任务运行python程序的,推荐使用linux或mac操作系统。

二、分析任务类型

高性能多任务编程有三种方式:

  1. 多进程,追求高运算:

任务类型:计算多IO少时,建议使用进程池的方式来编程。进程池中进程的数量一般推荐为CPU内核数的一至两倍。多进程程序运行时是并行执行。

常见任务:科学计算、数据分析等。

注意:创建进程开销极大,进程之间数据隔离,多进程存在数据不安全的情况,可规避所有IO。

  1. 多线程,运用最多:

任务类型:IO多计算少时,建议使用线程池的方式来编程。线程池中线程的数量一般推荐为CPU内核数的四到五倍,至多不超过十倍。多线程程序运行时是并发执行(由于GIL锁造成python多线程执行时不能并行执行)。

常见任务:爬虫等。

注意:创建线程开销小,线程之间数据共享,多线程存在数据不安全的情况,可规避所有IO。

  1. 协程,追求高并发:

任务类型:IO多计算少且需要大幅度提高并发数时,建议使用协程或多进程+多线程+协程的方式。

常见任务:爬虫、网络服务、web服务器等。

注意:创建协程开销极小,线程之间数据共享,多线程不存在数据不安全的情况,但只能规避部分IO。

三、Python解释器类型

目前大家用得最多的是CPython,它是用C语言实现的Python解释器,也是官方的并且是使用最广泛的Python解释器,它的软件包和兼容性最佳,CPython最新版本是3.9.1。官网是https://www.python.org/ 。

如果要追求高性能的话目前值得推荐的解释器是PyPy,PyPy提供了JIT编译器和沙盒功能,因此运行速度比CPython要快,它的软件包和兼容性不如CPython,Pypy最新版本是3.7。官网是https://www.pypy.org/ 。

四、注意事项

高性能多任务编程使用线程池的方式最多,要注意python线程编程的一个缺陷,即不能在线程外部关闭超时的线程。所以需要在任务内部对超时情况做处理。下面写一个简单的模拟爬虫案例:

代码:

from concurrent.futures import ThreadPoolExecutor
import requests

url = [('csdn', 'https://www.csdn.net/'), ('cnblogs', 'https://www.cnblogs.com/'),
       ('baidu', 'https://www.baidu.com/'), ('toutiao', 'https://www.toutiao.com/'),
       ('google', 'https://www.google.com/')]


def get(site):
    try:
        r = requests.get(site[1], timeout=5)  # 设置超时时限为5秒
    except requests.exceptions.ConnectTimeout:
        return site[0], '超时'
    return site[0], '正常'


if __name__ == "__main__":
    p_list = []
    with ThreadPoolExecutor(max_workers=5) as e:
        ret = e.map(get, url)

    for i in ret:
        print(f'网站“{i[0]}”下载情况是“{i[1]}”')

输出:

网站“csdn”下载情况是“正常”
网站“cnblogs”下载情况是“正常”
网站“baidu”下载情况是“正常”
网站“toutiao”下载情况是“正常”
网站“google”下载情况是“超时”

说明:

我们需要多任务执行的是get函数,它用来下载网页。在get中要对io操作进行超时预判,即超过5秒获取不到结果的网站放弃爬取。假设不设超时预判会导致线程一直反复爬取但一直获取不到数据而陷入死循环,极其影响整体影响效率。

总结:

因为python多线程无法从外部结束超时的线程,所以在多任务编程中要在函数内部对可能存在异常的任务做超时判断及处理。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1234.html

标签: pypy3
分享给朋友:

“Python之高性能多任务编程概述(python 多任务并行处理)” 的相关文章

Linux发行版需要杀软吗?卡巴斯基推出免费KVRT病毒扫描清理工具

IT之家 6 月 4 日消息,你认为使用 Linux 发行版,需要杀毒软件吗?或许很多用户认为 Linux 发行版偏小众,因此受到黑客攻击的风险也相对较小,不过卡巴斯基并不这么认为,近期推出了适用于 Linux 平台的杀毒软件。最新上线的 Linux 版本 Kaspersky Virus Remov...

前后端分离自动化运维平台开发

运维平台采用前后端分离:前端vue,框架vue-element-admin;后端python,框架django-rest-framework.目前运维平台模块如下:1、 CMDB管理应用管理、环境管理、开发语言管理、产品项目管理、资产管理2、 构建发布持续构建、持续部署、Jar工程依赖构建3、 容器...

html5+css3做的响应式企业网站前端源码

大家好,今天给大家介绍一款,html5+css3做的响应式企业网站前端源码 (图1)。送给大家哦,获取方式在本文末尾。首页banner幻灯片切换特效(图2)首页布局简约合理(图3)关于我们页面(图4)商品列表(图5)商品详情(图6)服务介绍(图7)新闻列表(图8)联系我们(图9)源码完整,需要的朋友...

Acustica Audio 发布模拟Roland Jupiter 双声道合成器插件 TH2

福利: Acustica Audio 发布模拟Roland Jupiter 风格的双声道合成器插件 TH2 免费下载 意大利 Acustica Audio 公司发布布模拟Roland Jupiter 风格的双声道合成器插件 TH2 ,灵感来源于Acustica Audio的THING-8系列,它是...

佳能 EOS R8 深度评测

佳能 EOS R8 的定位是入门级全画幅无反光镜可换镜头相机。尽管在产品阵容中处于这一位置,R8 仍然是一个强大的相机,配备了先进的 R6 II 同款成像传感器、快速处理器和令人难以置信的自动对焦系统,体积小、重量轻、价格低。这款相机是发烧友、旅行者、家庭以及任何想要全画幅传感器相机的人的绝佳选择。...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...