学习multiprocessing
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的更多相关文章
- 学习multiprocessing(2)
1 代码1: from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run ...
- Python 多进程教程
Python2.6版本中新添了multiprocessing模块.它最初由Jesse Noller和Richard Oudkerk定义在PEP 371中.就像你能通过threading模块衍生线程一样 ...
- python学习笔记——multiprocessing 多进程中的重构方法__init__
重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python学习笔记——multiprocessing 多进程组件 Pipe管道
进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- python学习笔记——multiprocessing 多进程模块Process
系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...
- Python学习笔记18:标准库之多进程(multiprocessing包)
我们能够使用subprocess包来创建子进程.但这个包有两个非常大的局限性: 1) 我们总是让subprocess执行外部的程序,而不是执行一个Python脚本内部编写的函数. 2) 进程间仅仅通过 ...
- python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦 2)提高效率 class qu ...
随机推荐
- ASP.NET使用ImageMap控件
文章来自:http://www.baike369.com/content/?id=5773
- python的web开发环境Django配置
我的系统的windows10: 第一步,安装python3.5 第二步,配置django,如图所示,在python的安装目录下的Scripts里面执行:pip install Django,我这儿提示 ...
- 4、Xcode8中的钥匙串保存数据取出时候为空的问题
Xcode7以及之前的版本直接使用Keychain存储数据即可,但是从Xcode8开始,再用之前的方法会发现,读取不到存进去的数据了,或者说,存储不进去了,原因是苹果加强了隐私保护,这个东西需要打开开 ...
- vim 删除行末所有内容
%s/\s*$//g
- mac上设置sudo不要密码
觉得每次sudo都需要设置密码太过麻烦,于是折腾了一番,谁知走了一番弯路记录下来. 以下是网上找到的步骤 chmod u+w /etc/sudoers 给当前用户增加写权限 vi /etc/sudo ...
- JS算法与数据结构之八皇后(晕晕)
算法核心思想 回溯算法 递归实现 程序实现 坐标系 循环递归 回溯 计数 收集位置 特效添加 <!DOCTYPE HTML> <html> <head> <m ...
- C# 常用接口学习 IComparable 和 IComparer
C# 常用接口学习 IComparable 和 IComparer 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 201 ...
- jmeter从外部文件取值问题,如果文件中的参数值为纯数字形式的,jmeter会默认将其识别成int型数据
如果你通过CSV Data Set Config或者_StringFromFile函数来参数化你的请求,需要特别注意当参数为纯数字时,jmeter会默认将其识别成int型数据,说明jmeter并不是默 ...
- was性能调优前期准备
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0707_wudan/#resources was应用服务器环境 ...
- 黑帽么metasploit
.Metasploit框架介绍Metasploit升级更新 Metasploit端口扫描 Metasploit SMB 获取系统信息 Metasploit 服务识别 Metasploit 密码嗅探 M ...