python3学习笔记之多进程分布式小例子


Posted in Python onFebruary 13, 2018

最近一直跟着廖大在学Python,关于分布式进程的小例子挺有趣的,这里做个记录。

分布式进程

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

master服务端原理:通过managers模块把Queue通过网络暴露出去,其他机器的进程就可以访问Queue了
服务进程负责启动Queue,把Queue注册到网络上,然后往Queue里面写入任务,代码如下:

#task_master.py
#coding=utf-8

#多进程分布式例子
#服务器端

from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support #server启动报错,提示需要引用此包
import random,time,queue

#发送任务的队列
task_queue = queue.Queue()
#接收结果的队列
result_queue = queue.Queue()

#从BaseManager继承的QueueManager
class QueueManager(BaseManager):
  pass
#win7 64 貌似不支持callable下调用匿名函数lambda,这里封装一下
def return_task_queue():
  global task_queue
  return task_queue
def return_result_queue():
  global result_queue
  return result_queue

def test():
  #把两个Queue注册到网络上,callable参数关联了Queue对象
  #QueueManager.register('get_task_queue',callable=lambda:task_queue)
  #QueueManager.register('get_result_queue',callable=lambda:result_queue)
  QueueManager.register('get_task_queue',callable=return_task_queue)
  QueueManager.register('get_result_queue',callable=return_result_queue)
  #绑定端口5000,设置验证码‘abc'
  manager = QueueManager(address=('127.0.0.1',5000),authkey=b'abc')#这里必须加上本地默认ip地址127.0.0.1
  #启动Queue
  manager.start()
  #server = manager.get_server()
  #server.serve_forever()
  print('start server master')
  #获得通过网络访问的Queue对象
  task = manager.get_task_queue()
  result = manager.get_result_queue()
  #放几个任务进去
  for i in range(10):
    n = random.randint(0,10000)
    print('put task %d...' % n)
    task.put(n)
  #从result队列读取结果
  print('try get results...')
  for i in range(10):
    r = result.get(timeout=10)
    print('result:%s' % r)

  #关闭
  manager.shutdown()
  print('master exit')

if __name__ == '__main__':
  freeze_support()
  test()

运行截图如下:

python3学习笔记之多进程分布式小例子

在分布式多进程环境下,添加任务到Queue不可以直接对原始的task_queue进行操作,那样就绕过了QueueManager的封装,必须通过manager.get_task_queue()获得的Queue接口添加。

任务进程,代码如下:

#task_worker.py
#coding=utf-8

#多进程分布式例子
#非服务端:worker

import time,sys,queue
from multiprocessing.managers import BaseManager

#创建类似的QueueManager
class QueueManager(BaseManager):
  pass

#由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字即可
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

#连接到服务器,也就是运行task_master.py的机器
server_addr = '127.0.0.1'
print('connect to server %s...'% server_addr)
#端口和验证码注意要保持完全一致
m = QueueManager(address=(server_addr,5000),authkey=b'abc')
#从网络连接
m.connect()
#获取Queue的对象
task = m.get_task_queue()
result = m.get_result_queue()
#从task队列获取任务,并把结果写入result队列
for i in range(10):
  try:
    n = task.get(timeout=1)
    print('run task %d * %d...'% (n,n))
    r = '%d * %d = %d' % (n,n,n*n)
    time.sleep(1)
    result.put(r)
  except queue.Empty:
    print('task queue is empty')
#处理结果
print('worker exit')

 运行截图如下:

python3学习笔记之多进程分布式小例子

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中lambda的用法及其与def的区别解析
Jul 28 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
Python简易计算器制作方法代码详解
Oct 31 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
Python学习笔记之装饰器
Aug 06 Python
浅谈python 类方法/静态方法
Sep 18 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
分享一个python的aes加密代码
Dec 22 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 #Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 #Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 #Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 #Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 #Python
20个常用Python运维库和模块
Feb 12 #Python
使用python实现BLAST
Feb 12 #Python
You might like
综合图片计数器
2006/10/09 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
浅析php原型模式
2014/11/25 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
PHP学习笔记之session
2018/05/06 PHP
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
js中this用法实例详解
2015/05/05 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
python访问系统环境变量的方法
2015/04/29 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
Python元字符的用法实例解析
2018/01/17 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
恶搞卫生巾广告词
2014/03/18 职场文书
《学会合作》教学反思
2014/04/12 职场文书
园艺师求职信
2014/04/27 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python