用了python多进程,我跑程序花费的时间缩短了4倍
应用场景:本人需要对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倍的更多相关文章
- python 多进程数量 对爬虫程序的影响
1. 首先看一下 python 多进程的优点和缺点 多进程优点: 1.稳定性好: 多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程.基于这个特性,常常会用多进程来实现守护服务器的功 ...
- 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)
下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...
- python 多进程开发与多线程开发
转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文: 博文1 博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...
- Python多进程库multiprocessing中进程池Pool类的使用[转]
from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...
- python多进程(二)
之前实现的数据共享的方式只有两种结构Value和Array.Python中提供了强大的Manager专门用来做数据共享的,Manager是进程间数据共享的高级接口. Manager()返回的manag ...
- Python多进程与多线程编程及GIL详解
介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...
- 一篇文章搞定Python多进程(全)
1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Proce ...
- Python多进程和多线程是鸡肋嘛?【转】
GIL是什么 Python的代码执行由 Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行.即每个CPU在任意时 ...
- Python多进程库multiprocessing创建进程以及进程池Pool类的使用
问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...
随机推荐
- 题解 P6005 【[USACO20JAN]Time is Mooney G】
抢第一篇题解 这题的思路其实就是一个非常简单的dijkstra,如果跑到第一个点的数据不能更新的时候就输出 很多人不知道要跑多少次才停.其实这题因为答案要减去 T*c^2,而每条边的值 <= 1 ...
- JavaSE--Comparator 和 Comparable 区别
public interface Comparable<T> 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法 ...
- P2P平台爆雷不断到底是谁的过错?
早在此前,范伟曾经在春晚上留下一句经典台词,"防不胜防啊".而将这句台词用在当下的P2P行业,似乎最合适不过了.就在这个炎热夏季,P2P行业却迎来最冷冽的寒冬. 引发爆雷潮的众多P ...
- Window Redis安装
1.下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 2. 安装redis 把下载的Redis-x64-3.2.100 ...
- hdu 1246
很久没有写题解了~因为懒(年纪大了就是脸皮厚,还有脸说) 这道题今天花了很长时间去推,一开始以为是规律题,没推出来,直接模拟也TLE了,接着考虑实在是没思路,看了题解. 思路大概就是这样: 先上代码( ...
- Docker添加root用户
0 环境 系统环境:centos7 服务器:阿里云 1 正文 1 进入rabbitmq容器中 docker exec -i -t 563 bin/bash 2 添加用户(用户名和密码) rabbitm ...
- 用PrintStream向文件输入内容
import java.io.*; public class Main { public static void main(String[] args) throws FileNotFoundExce ...
- Convert between Unix and Windows text files - IU Knowledge Base from: https://kb.iu.edu/d/acux
vi. To input the ^M character, press Ctrl-v , and then press Enter or return . In vim, use :set ff=u ...
- [JS]實作LinkedList鏈結串列
由於自身資料結構的基礎薄弱,買了一本JavaScript資料結構與演算法實作的書來看,重新把LinkedList鏈結串列學習了一遍,並用JS實作出來. LinkedList鏈結串列 要存放多個元素,最 ...
- Linux基础篇二:Bash shell(壳,命令解释器)介绍
shell执行方式: 第一:输入命令 (简单工作) 第二: 脚本 (适合大量工作) Bash shell 实际上的叫法是 GNU/Bash 如何查询呢: bash - version ...