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中global用法实例分析
Apr 30 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
python3.5基于TCP实现文件传输
Mar 20 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
基于Python 的语音重采样函数解析
Jul 06 Python
十个Python自动化常用操作,即拿即用
May 10 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
php中计算时间差的几种方法
2009/12/31 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
javascript三元运算符用法实例
2015/04/16 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
Angular设置别名alias的方法
2018/11/08 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Python是编译运行的验证方法
2015/01/30 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
申报职称专业技术个人的自我评价
2013/12/12 职场文书
物流仓储计划书
2014/01/10 职场文书
高中运动会入场词
2014/02/14 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
小学生毕业评语
2014/12/26 职场文书
捐助感谢信
2015/01/22 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android