应用场景:本人需要对200万条网页html格式数据进行清洗,提取文字后将分词结果写入数据库,之前做了一次,大概花费了80多个小时才跑完。机器配置是4核,内存8G;开完会领导让再改点东西重新跑一遍,然后说用多进程或者多线程跑,速度快。

本人接触python不到两个月,以前也基本不怎么编程,所以这种优化什么的东西都不懂,只好求助同事。同事告诉我直接看廖雪峰的教程就ok了。先看了一下廖雪峰写的单个进程代码,比较容易懂,但是我需要开四个进程,把我的cpu都占满来跑,这样效率才最大。

所以又看了多进程的例子,并自己实践了一下:

from multiprocessing import Process
import os
from multiprocessing import Pool
def run_proc(i):
a=i*3
print(a)
if __name__=='__main__':
p = Pool(4)
for i in range(5):
p.apply_async(run_proc, args=(i,))
p.close()
p.join()

看一下上面代码,Pool代表的是一个进程池,里面写几就代表你想跑几个进程,但是你的cpu是几核你就只能开几个进程,而且进程数最好是2的整数倍(同事告诉我的)。查看cpu核数的方法就是打开任务管理器,然后性能里面有几个小窗口就代表几核。

我的是四个小窗口,代表四核。按照上面的例子我用四个核来计算run_proc这个函数,然后每个核计算的是一个i值对应的run_proc函数。

接下来到我的实际场景中,我是想从数据库中读取200万条数据并对所有数据进行一系列操作后再写如数据库,这里我采用四核全跑,每个核分配50万数据来进行:

start = datetime.datetime.now()
p = Pool(4) # 建立进程池
get_data_cmd=['SELECT * FROM 标讯样本_二百万 limit 0,500000',
'SELECT * FROM 标讯样本_二百万 limit 500000,500000',
'SELECT * FROM 标讯样本_二百万 limit 1000000,500000',
'SELECT * FROM 标讯样本_二百万 limit 1500000,500000'
]
for cmd in get_data_cmd: # 将每个命令传入不同的子进程执行相同的代码
p.apply_async(con_seg_word, args=(cmd,))
p.close()
p.join()

我的方法比较笨,就是将四个不同的sql命令放在一个列表中,然后循环读取列表中的语句来分配给每个核要跑的函数,这样就ok了,时间大约比之前少了4倍吧。

apply_async这个方法就是你要将你的这四个sql命令给哪个函数,其中arg就是要传递进函数的参数。

PS:这个多进程的方法其实有很多隐藏的问题在里面的,例如针对limit这个问题,后面会越来越慢,因为limit相当于全表进行过滤,因此不推荐此种方式;

另外在innodb这种引擎数据库中,当limit几千万数据后面的数据时候会报错,(the totle number of locks exceeds the lock table size),这是因为InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_pool_size的值来解决这个问题,并且重启mysql服务。

这里还需要进一步来探索多进程的内部机制从而来写一个更好的多进程栗子。

用了python多进程,我跑程序花费的时间缩短了4倍的更多相关文章

  1. python 多进程数量 对爬虫程序的影响

    1. 首先看一下 python 多进程的优点和缺点 多进程优点: 1.稳定性好: 多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程.基于这个特性,常常会用多进程来实现守护服务器的功 ...

  2. 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)

    下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...

  3. python 多进程开发与多线程开发

    转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文:  博文1  博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...

  4. Python多进程库multiprocessing中进程池Pool类的使用[转]

    from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...

  5. python多进程(二)

    之前实现的数据共享的方式只有两种结构Value和Array.Python中提供了强大的Manager专门用来做数据共享的,Manager是进程间数据共享的高级接口. Manager()返回的manag ...

  6. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

  7. 一篇文章搞定Python多进程(全)

    1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Proce ...

  8. Python多进程和多线程是鸡肋嘛?【转】

    GIL是什么 Python的代码执行由 Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行.即每个CPU在任意时 ...

  9. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

随机推荐

  1. ZJNU 1262 - 电灯泡——中高级

    在影子没有到达墙角前,人越远离电灯,影子越长,所以这一部分无需考虑 所以只需要考虑墙上影子和地上影子同时存在的情况 因为在某一状态存在着最值 所以如果以影子总长与人的位置绘制y-x图像 会呈一个类似y ...

  2. [原]C++新标准之std::thread

    原 总结 C++11 thread  概览 std::thread 类定义 各个成员函数的简单介绍 例子 更多 参考资料 概览 从C++11开始提供了线程的支持,终于可以方便的编写跨平台的线程代码了. ...

  3. 898B. Proper Nutrition#买啤酒问题(枚举&取余)

    题目出处:http://codeforces.com/problemset/problem/898/B 题目大意:为一个整数能否由另外两个整数个整数合成 #include<iostream> ...

  4. [概率DP]相逢是温厚

    题意 有\(n\)场比赛,他每次等概率地选择一场,选择的比赛可能有没ac过的题,他一定会ac这次比赛中的某一道,并说我好菜啊.如果全ac过了,也会说我好菜啊.求期望说多少次我好菜啊. 注意题目中每场题 ...

  5. kaggle注册获取数据

    安装谷歌访问助手,主要参考下面的作者写的 https://segmentfault.com/a/1190000020548973?utm_source=tag-newest 安装之后,打开蓝灯或其他翻 ...

  6. Flask pythn Web 框架总结

    Flask pythn Web 框架总结 一, Flask 介绍 Flask 是一个基于Python 实现的web 开发的'小型轻框架' 1. flask介绍 Flask是一个基于Python实现的w ...

  7. [Algo] 73. Combinations Of Coins

    Given a number of different denominations of coins (e.g., 1 cent, 5 cents, 10 cents, 25 cents), get ...

  8. day03-函数

    形参:位置参数:必须传 *args:动态参数,可以接收任意多个位置参数 默认值参数:可以传也可以不传 **kwargs:动态参数,可以接收多个关键字参数. 实参:按照位置传参,按照关键字传参. #顺序 ...

  9. linux的进程和管道符(二)

    回顾:进程管理:kill killall pkill问题:1.pkill -u root 禁止2.用户名不要用数字开头或者纯数字windows的用户名不要用中文3.pokit/etc/passwd 6 ...

  10. Java基础语法要点

    1.Java中byte.short.int.long的取值范围 byte:[-128,127] short:[-32768,32767] int:[-2147483648,2147483647] lo ...