1. multiprocessing.Pool

from multiprocessing.pool import Pool

def gen_row():
...return rows def main(rows):
   i = 1
for row in rows:
i += 1
     ...
print(i) if __name__ == "__main__":
rows = gen_row()
with Pool(4) as p:
p.map(main, (rows[:100000],rows[100000:200000],rows[200000:300000],rows[300000:])) #会打印4个 i 出来,把 map()第二个参数给定长度为1的 iterable 参数,只打印一个 i 出来;
#如果是 Pool(2) ,传4个 rows 进去依然得到4个 i ;
#不使用 Pool 和使用 Pool 得到的结果居然不一样,没想明白,所以不能用在操作同一个对象上,p.map(f, [1,2,3,4]) 这样参数之间不存在关系就能保证结果一致。

下面这个官网的例子能体现出优势:

from multiprocessing import Pool

 def f(x):
return x*x with Pool() as p:
p.map(f, range(10000000))

再想一下之后,看下面:

import json
import MySQLdb
from multiprocessing.pool import Pool def gen_row():
db = MySQLdb.connect(host='192.168.1.205', user='root', passwd='', db='kaqu')
c = db.cursor()
c.execute("select params from t1")
rows = c.fetchall()
return rows def main(row):
# for row in rows:
try:
latitude = float(json.loads(row[0])['latitude'])
longitude = float(json.loads(row[0])['longitude'])
if not (latitude == 5e-324 or latitude == 0.0):
print(latitude, longitude)
except:
pass if __name__ == "__main__":
rows = gen_row()
with Pool(2) as p:
p.map(main, rows) #这里直接可以把rows拿过来

奇怪的是:

Pool(2)

time python test2.py >> all.log
#wc -l all.log
all.log

Pool(4)

time python test2.py >> all2.log
#wc -l all2.log
all2.log

Pool(5)

# wc -l all.log
all.log

Pool(10)

# wc -l all.log
all.log

每次结果都不一样!!!系统是VM 4核心虚拟机。其中 Pool(4) 是可靠的数据,因此请根据 cpu 核心数来操作!!

PS:导致以上结果差异的原因是没有等待线程结束,加上close()   join() 即可,见下面实例。

小结:

使用官网的例子,Pool() 不用带第一个参数,会自动根据cpu数来进行。

实例:

import multiprocessing as mul
import time def f(number):
time.sleep(1)
return number + 1 if __name__ == '__main__':
sequence = list(range(4))
p = mul.Pool()
print(p.map(f, sequence))
p.close()
p.join()

实例2:

from multiprocessing import Pool
import os, time, random def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start))) if __name__=='__main__':
print('Parent process %s.' % os.getpid())
p = Pool(4)
for i in range(8):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')

输出:

Parent process 11756.
Waiting for all subprocesses done...
Run task 0 (11048)...
Run task 1 (13032)...
Run task 2 (6736)...
Run task 3 (8884)...
Task 3 runs 0.50 seconds.
Run task 4 (8884)...
Task 2 runs 1.03 seconds.
Run task 5 (6736)...
Task 1 runs 1.19 seconds.
Run task 6 (13032)...
Task 0 runs 2.86 seconds.
Run task 7 (11048)...
Task 4 runs 2.69 seconds.
Task 6 runs 2.22 seconds.
Task 5 runs 2.76 seconds.
Task 7 runs 2.10 seconds.
All subprocesses done.

可以发现只创建了4个子进程,因为设定了 Pool(4) 。

PS:参考廖雪峰 Python

学习multiprocessing的更多相关文章

  1. 学习multiprocessing(2)

    1 代码1: from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run ...

  2. Python 多进程教程

    Python2.6版本中新添了multiprocessing模块.它最初由Jesse Noller和Richard Oudkerk定义在PEP 371中.就像你能通过threading模块衍生线程一样 ...

  3. python学习笔记——multiprocessing 多进程中的重构方法__init__

    重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...

  4. python学习笔记——multiprocessing 多进程组件-队列Queue

    1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...

  5. python学习笔记——multiprocessing 多进程组件 Pipe管道

    进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...

  6. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  7. python学习笔记——multiprocessing 多进程模块Process

    系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...

  8. Python学习笔记18:标准库之多进程(multiprocessing包)

    我们能够使用subprocess包来创建子进程.但这个包有两个非常大的局限性: 1) 我们总是让subprocess执行外部的程序,而不是执行一个Python脚本内部编写的函数. 2) 进程间仅仅通过 ...

  9. python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)

    1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦    2)提高效率 class qu ...

随机推荐

  1. js便利关联数组 及数组定义方式 分类

    "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv=& ...

  2. 矩阵赋值实例(matrixAssign)

    题目:给一个二维数组赋值. 分析:主机端代码完成的主要功能: 启动CUDA,使用多卡时应加上设备号,或使用cudaSetDevice()设置GPU设备. 为输入数据分配内存空间 初始化输入数据 为GP ...

  3. Java集合初体验

    背景:        因为对Java的集合完全不了解,所以才在网上找了找能形成初步印象的文章进行学习,大多涉及的是一些概念和基础知识. 一.数组array和集合的区别: (1)数组是大小固定的,并且同 ...

  4. BigDecimal-解决商业计算

    1.String to BigDecimal String amtStr = "1234.56"; BigDecimal amtBD = new BigDecimal(amtStr ...

  5. 线性规划?数学?差分约束?Good Bye 2016 C

    http://codeforces.com/contest/750/problem/C 反正我不会这道题...为什么那么多人做出来了...我好菜.jpg 题目大意:cf每个人都有分数,每次都会在div ...

  6. java 基础知识2

  7. 不同浏览器对URL最大长度的限制

    不同浏览器对URL最大长度的限制   1.今天碰到一个bug,window.open后面的页面,接收参数不全,导致后台报错.实验了一下.发现是使用get方法请求服务器时,URL过长所致 微软官方的说明 ...

  8. Objective-C与Swift下的自定义打印函数(Debug和Release)

    1.Objective-C 在使用Objective-C进行开发的过程中,为了Debug会不断的设置打印函数.如下图是我们经常用的,用来测试监听方法的实现与否: NSLog(@"%s&quo ...

  9. Online Procurement Auctions for Resource Pooling in Client-Assisted Cloud Storage Systems---INFOCOM 2015

    [标题] [作者] [来源] [对本文评价] [why] 存在的问题 [how] [不足] assumption future work [相关方法或论文] [重点提示] [其它]

  10. 旋转数组中的最小数字,剑指offer,P70 二分查找来实现O(logn)的查找

    public class MinNumberInRotatedArray { public int getMinNumInRotatedArray(int[] array) { if(array == ...