安装方式:
在 下载页面中 选择合适的版本进行安装, 如 zip后缀的文件,解压后, 进入文件目录中, 通过 python setup.py install 进行安装;
功能特点:
- 在SMP和集群上并行执行python代码; 说白了 就是 一个机器上利用CPU多核,或者 在多个机器上利用每个机器的CPU 执行python代码;
- 易于理解和实现基于Job的并行化技术(易于并行转换串行应用程序)
- 自动检测并使用 CPU上 所有进程数作为 worker数; 默认就是此设置;
- 运行时 worker数量可以进行修改;
- 具有相同功能的后续作业的开销很低(实现透明缓存以减少开销)
- 动态负载平衡(作业在运行时在处理器之间分配)
- 容错性(如果其中一个节点失败,则将任务重新安排到其他节点上)
- 计算资源 可以自动发现;
- 自动发现计算资源 和容错 导致了 动态分配计算资源;
- 基于SHA认证的网络连接;
- 跨平台可移植性和互操作性(Windows,Linux,Unix,Mac OS X)
- 跨架构可移植性和互操作性(x86,x86-64等)
- 完全开源;
官方文档 的示例代码 有很多问题,不易理解;如下为 摸索后的示例代码;
server端 多线程+PP 集群服务 通过密码认证 的示例代码:
import time
from concurrent.futures._base import as_completed
from concurrent.futures.thread import ThreadPoolExecutor
import pp
# 分布式计算集群中 worker服务的 IP:PORT
ppservers = ('192.168.2.3:35000',)
# 启动pp master 服务
job_server = pp.Server(ppservers=ppservers, secret='mys')
def sum_primes(n):
"""
导入的包 必须在里面
:param n:
:return:
"""
# 可以在函数内加入 如下一行,这时 job_server.submit方法第四个参数便不再需要
import time
time.sleep(n)
print(n, 'sleep')
return n
def use(n):
job = job_server.submit(sum_primes, (n,))
return job()
print("Starting pp with", job_server.get_ncpus(), "workers")
pool = ThreadPoolExecutor()
pool_result = [pool.submit(use, func_param) for func_param in [1, 3, 4, 2, 5]]
for result in as_completed(pool_result):
job_server.print_stats()
item = result.result()
if int(item) > 3:
break
print(item, 'df')
print('finish')
pp.Server对象初始化时 参数含义及用法:
- ppservers: 参数值必须为 tuple类型, 每个元素格式为 IP地址:端口号
- secret: 设置的密码, worker端的服务 必须是这个密码才能连接
- ncpus: 要在本地计算机上启动的工作进程数
- 不填此参数, 默认 本master 启动本机器所有进程作为内置worker;
- 值为0:本master不启动worker,只使用worker服务;
- 其他整数值, 本master启动本机器对应数量的worker; 优先使用本地机器的worker
Worker端启动示例:
- worker端机器 先 安装 PP
- worker端 命令行执行 如下命令,即可启动成功;
ppserver.py -p 35000 -i 192.168.2.3 -s "mys" -d
命令行 worker服务启动参数含义及用法:
-d : debug模式,会打印所有运行日志,默认非此模式
-a : enable auto-discovery service;启动自动发现服务功能;
-i interface : interface to listen;监听的IP地址
-b broadcast : broadcast address for auto-discovery service
-p port : port to listen;监听的端口
-w nworkers : number of workers to start;启动的 worker数量,默认为 所有可以进程数;
-s secret : secret for authentication;认证的密码
-t seconds : timeout to exit if no connections with clients exist; 此服务如果没有服务端连接时,在超时 对应秒后,此服务进程停止;默认 不超时
-k seconds : socket timeout in seconds; 运行 worker时的超时时间,默认 不超时; 如 worker处理请求10s,此值设置9s;则停止处理此请求;
-P pid_file : file to write PID to;PID 文件指向位置
注意事项:
- 因为 此服务 运行目的为 将原本在 本地进程执行 的耗时计算密集型任务 分散到 其他机器或CPU上执行, 而且 worker服务的实现方式 不用写任何代码,只需一行命令; 其实现方式 是将 需要执行的 函数 发送给远程worker服务进行执行; 这时 由于 worker是以 一个函数为执行 单位,如果 函数内部包含了 需要import的包或模块,则 需要 在函数内部 加上 from xxx import xxx; 或者 在submit 方法最后一个参数中加上 包名(submit中只能是包名,不能是模块名);
- 注意 如果 被执行函数中 有任何 需要额外安装的第三方包,如 numpy,pandas,或 自己写的包 则 都需要在 worker服务环境中进行安装,否则 执行任务失败;
- 在flask等等项目框架中,最好将 pp 的 master server启动放在app初始化中,和 mysql,mongo 等 一个级别; 否则 在 接口处理中 频繁的启动,销毁 会增加资源消耗 和 接口处理时间增加;
- 注意worker服务 的 保活 可以使用 supervisor 或 docker 或k8s中;
和 celery的比较:
- celery主要用在 异步处理上,主要为了 解耦业务逻辑,削峰填谷; 让 部分业务处理 放在 worker上执行后续处理;
- pp主要用在 分布式计算上,和 阿里云的函数式计算 的应用场景相同; 都是用在 单进程或单机器 对 计算密集型任务 耗时很长,但是可以通过 分散到 多个机器上 解决耗时长 的问题时 使用;
- celery用在 异步非及时性 需求中; pp主要用在同步及时性高,且计算密集型的 需求中;
相关链接:
https://www.parallelpython.com/
https://wiki.python.org/moin/ParallelProcessing