python+mysql—高效的数据处理方案

本文介绍了在处理大规模数据时,如何利用Python的多进程、MySQL数据库和BaseManager实现并发执行和结果保存。通过多进程避免GIL限制,利用BaseManager管理共享对象,结合MySQL记录程序执行结果,实现高效的数据处理方案。同时强调了在编写处理函数和数据库操作时的注意事项。
摘要由CSDN通过智能技术生成

使用场景

大规模数据处理;

多个任务可以并发执行;

需要保存结果;

为实现以上三个要求,就需要充分利用服务器中的多核资源,让程序高效并发执行,并采用一定的方式保存结果。

用到的工具和方法

采用多进程 + mysql + BaseManager

  1. 由于pythonGIL全局锁,如果利用多线程无法充分利用多核资源,因此使用多进程进,充分利用多核资源,榨干机器的性能! 并且在实际应用中需要给每个进程传参,以处理对应的子任务,所以使用apply/apply_async这个多进程函数。 另外多进程可以将进程分步到多台机器上跑,但是数据处理任务应该用不到,hhh…

  2. 由于在开发中经常遇到需要任务返回结果的情况,所以需要对程序执行结果进行记录。为了提高记录的效率,采用mysql进行数据保存,构建属于自己的数据库。

  3. 由于每个进程有独立的资源,不同进程间共享资源非常麻烦,为了可以操作共享对象,进行数据库写入等一些操作,采用 BaseManager 进行共享对象的管理。

开启多进程

BaseManager管理器提供了一种创建共享数据的方法,可以在不同进程中共享,甚至可以通过网络跨机器共享数据。管理器维护一个用于管理共享对象的服务,这个服务也是一个子进程。其他进程可以通过代理访问这些共享对象。

之所以选择BaseManager管理共享对象,因为这种方式可以很简单的将一些操作打包成一个类,然后将这个类作为对象进行共享。

from multiprocessing import Lock,cpu_count,Pool
from multiprocessing.managers import BaseManager

class cls_name_1():
    ...
class cls_name_2():
    ...

def fun(my_var_1,my_var_2,i1,i2,i3,..):
    ...
    

if __name__ == "__main__":
    # register可以将一个类型或者可调用对象注册到管理器类。
    # 第一个参数是 "类型标识符",用于唯一表示某种共享对象,必须是一个字符串。
    # 第二个参数是一个可调用对象,用来为类型标识符创建对象。这个参数就是我们实际想共享的对象
    BaseManager.register("name_1",cls_name_1)
    BaseManager.register("name_2",cls_name_2)
    # 创建一个 BaseManager 对象。
    # 一旦创建,应该及时调用start()以确保管理器对象对应的管理进程已经启动。
    m = BaseManager() 
    m.start()

    my_var_1 = m.name_1() # 生成共享对象的实例
    my_var_2 = m.name_2()

    p = Pool(cpu_count()) # 返回系统的 CPU 数量
    for i1,i2,i3... in params:
        r = p.apply_async(fun,args=(my_var_1,my_var_2,i1,i2,i3,..))
    p.close()
    p.join()

定义好进程启动以及共享对象后,就可以将共享对象和执行每个子任务所需要的参数传递到执行函数fun里面,开始之后便开始并发执行。

fun函数编写要点

  1. fun里面的函数要正确编写,否则进程无法执行所有的代码,遇到出错的地方便停止执行,并没有任何错误输出;
  2. 可以添加try..except..捕获错误,然后将错误print到屏幕。但是有的机器会打印错误,有的则不会打印错误。也是很迷_
  3. 在对共享对象使用时要注意加锁;

mysql编写要点

在这里用的是pymysql,安装方式:pip install pymsql。关于mysql我会在后面出一篇文章。现在主要说一下mysql编程时的一些要点,避免踩坑~

  1. 在使用%s填充sql语句时,对于表名,字段名,要加上 ` 这个符号,波浪线的英文键;
  2. 在用%s填充sql语句的某个字段的值的时候,要加单引号 ’ 将 %s 包起来;

以上就是在大规模处理数据时使用的一种快速处理数据的方法。
期待与各位交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonMySQL和Django是一套常用的开发工具组合,用于开发系统和网站。Python是一种高级编程语言,具有简单易用、多功能和可扩展性等特点。MySQL是一种关系型数据库管理系统,可用于存储和管理系统中的数据。而Django是一个基于Python开发的强大的Web应用框架,它提供了许多开发所需的功能和工具。 使用这个开发工具组合可以轻松开发系统。首先,Python作为一种易读易写的语言,使得开发变得简单和高效。它提供了丰富的库和模块,可以快速实现各种功能,例如文件操作、数据处理和网络通信等。其次,MySQL作为一种强大的数据库,可以轻松存储和管理系统中的数据。它支持多个用户同时访问,并提供了强大的查询功能,使得对数据的操作变得简单和高效。最后,Django作为一个Web应用框架,提供了许多内置的功能和工具,例如URL路由、表单处理、认证和授权等。开发人员可以利用这些功能来快速构建系统的各个模块和功能。 使用PythonMySQL和Django进行系统开发具有许多优点。首先,它们都是开源的,可以免费使用和修改。其次,它们具有广泛的社区支持和强大的生态系统,可以轻松找到解决方案和扩展。此外,PythonMySQL和Django都具有良好的文档和教程,使得学习和开发变得更加容易。 总之,使用PythonMySQL和Django进行系统开发是一种简单高效的选择。它们提供了丰富的功能和工具,可以轻松构建各种系统和网站。无论是开发小规模的个人项目还是大型的商业应用,这个工具组合都能满足开发需求,并帮助开发人员快速高质量地完成工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值