python 多进程使用
问题描述
假设:有个数据操作,处理100万条数据,每个数据的value+1。如简单代码假设
for x in range(1,100): x++
从数据库获取100条了,然后想多进程去执行x++?还是说多进程去数据库获取数据?谢谢了
问题解答
回答1:有一个问题: 如果是数据库里面的数据, 为什么不执行sql,这比什么多进程要高效的多吧?如果非要你给出的二选一, 那么考虑一下:
1). 如果你要用多进程去数据库获取数据(就算你用了mysql连接池,可以不怎么考虑数据库连接的io消耗),你每取一次数据,总要有一次查询吧, 完了以后,你还要把更新后的数据写入到数据库了, 又是一次数据库操作,想想这个消耗有多大?2). 数据库获取100万数据,然后想多进程去执行x++; 这种情况啊,只要计算机内存够(只有100万数据,基本是没问题的), 用python的进程池map一下,确实也是没什么问题回答2:
先将原始数据存入队列(queue)中,作为生产者后从队列中取数据,执行操作,作为消费者这时,可以在消费者开多线程(当然你锁处理得好的话,生产者也可以做多线程)
while tmp_queue.empty() is not True: x = tmp_queue.get() x += 1
在队列中,如果一直存在元素线程会持续进行操作。
回答3:其实Python中实现多进程的最佳方式是使用multiprocessing中的map
例子(Python 3):
# f.py# 要对某个列表中每个元素都执行一次的functiondef f(x): return x + 1
# main.pyfrom multiprocessing import poolfrom f import f# 创建进程池p = pool.Pool(4)lst = range(100)# 使用多进程对整个列表进行计算print(p.map(f, lst))回答4:
你可以直接把数据读取和数据+1两个函数再写到一个操作中啊,然后用多进程去操作,就上楼上说的一样用进程池进行操作。根据你的cpu核数,设置进程池的大小。由于多进程间不进行内存共享、也不能直接通信,你先用多进程从数据库中把所有数据读出来,然后再用多进程进行val+1也行的
相关文章:
1. docker-machine添加一个已有的docker主机问题2. javascript - 新建js文件时如何自动地加上"use strict"?3. javascript - 如何获取未来元素的父元素在页面中所有相同元素中是第几个?4. apache - nginx 日志删除后 重新建一个文件 就打不了日志了5. java - 原生CGLib内部方法互相调用时可以代理,但基于CGLib的Spring AOP却代理失效,为什么?6. node.js - node express 中ajax post请求参数接收不到?7. java - tomcat服务经常晚上会挂,求解?8. javascript - 用jsonp抓取qq音乐总是说回调函数没有定义9. windows-7 - Win7中Vmware Workstatoin与Xampp中Apache服务器端口冲突?10. javascript - 新浪微博网页版的字数限制是怎么做的
