文档章节

利用Queue和managers实现分布式进程

acutesun
 acutesun
发布于 2017/07/23 16:02
字数 517
阅读 3
收藏 0

multiprocessing模块中的managers子模块支持把多进程分布到多台机器上。
首先编写服务进程,服务进程负责把任务写入task_queue, 并接收工作进程返回的result_queue
serverManager.py:

from multiprocessing.managers import BaseManager,Queue

# 1. 建立task_queue和result_queue, 用来存放任务和结果
task_queue = Queue()
result_queue = Queue()


class QueueManager(BaseManager):
    pass

# 2. 把创建的队列注册在网络上,利用register方法, callable 参数关联类Queue对象
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)

# 3.绑定端口8000, 验证口令'123'
manager = QueueManager(address=('', 8000), authkey='123'.encode('utf-8'))
manager.start()

# 4. 通过manager获取网络注册的Queue对象
task = manager.get_task_queue()
result = manager.get_result_queue()

# 5.添加任务
for url in ["imageUrl_" + str(i) for i in range(10)]:
    print('put task %s...' % url)
    task.put(url)

# 6.获取返回结果
print('get result...')

for i in range(10):
    print('result is %s' % result.get(timeout=10))

manager.shutdown()

工作进程通过网络获取任务队列task_queue, 对任务队列中的数据进行处理后写入result_queue

workerManager.py:

import time
from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
    pass

# 1.注册获取queue
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

# 2.连接服务器
server_addr = '127.0.0.1'
print('connect to server')
mng = QueueManager(address=(server_addr, 8000), authkey='123'.encode('utf-8'))

# 连接
mng.connect()
# 3. 获取queue对象
task = mng.get_task_queue()
result = mng.get_result_queue()

# 4.从task获取任务,并把结果写入result
while not task.empty():
    image_url = task.get(True, timeout=5)
    print('run task download %s ...' % image_url)
    time.sleep(1)
    result.put('%s--->success' % image_url)

print('worker finish!')

首先运行服务进程,得到结果:

put task imageUrl_0...
put task imageUrl_1...
put task imageUrl_2...
put task imageUrl_3...
put task imageUrl_4...
put task imageUrl_5...
put task imageUrl_6...
put task imageUrl_7...
put task imageUrl_8...
put task imageUrl_9...
get result...

然后运行工作进程

connect to server
run task download imageUrl_0 ...
run task download imageUrl_1 ...
run task download imageUrl_2 ...
run task download imageUrl_3 ...
run task download imageUrl_4 ...
run task download imageUrl_5 ...
run task download imageUrl_6 ...
run task download imageUrl_7 ...
run task download imageUrl_8 ...
run task download imageUrl_9 ...
worker finish!

最后服务进程输出

result is imageUrl_0--->success
result is imageUrl_1--->success
result is imageUrl_2--->success
result is imageUrl_3--->success
result is imageUrl_4--->success
result is imageUrl_5--->success
result is imageUrl_6--->success
result is imageUrl_7--->success
result is imageUrl_8--->success
result is imageUrl_9--->success

© 著作权归作者所有

共有 人打赏支持
acutesun
粉丝 0
博文 71
码字总数 83152
作品 0
程序员
运维学python之爬虫中级篇(三)分布式进程

相对线程来说,进程更稳定一些,线程只是在同一台机器上利用多CPU,无法实现不同机器的共享,而多进程则可以实现分布到不同机器去运行,应用到爬虫上,就例如:我们要爬取网站图片,如果使用...

578384
01/07
0
0
运维学python之爬虫中级篇(一)进程

最近流感肆虐京城,各大医院爆满,不巧我也被病毒击中, 起初咳嗽小感冒喝了点感冒冲剂以为可以扛过去,结果发展为嗓子干哑,最后又开始发烧,折腾好几天,没办法去医院走了一圈花了大洋,也...

578384
01/05
0
0
zookeeper系列(六)实战分布式队列

分布式队列 在传统的单进程编程中,我们使用队列来存储一些数据结构,用来在多线程之间共享或传递数据。 分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进程、跨主机、跨网...

chenkangyao
08/07
0
0
Python-多线程与并行计算

Python-多线程与并行计算 饿死我了。。。。今天看图像处理cuda的时候看到了并行计算,又恰巧参加第二届CCF举办CCSP比赛的时候,第五题是可以并行计算的。。。在赛后分享上,听清华大佬讲得栩...

googler_offer
2017/11/21
0
0
Python爬虫进阶六之多进程的用法

前言 在上一节中介绍了thread多线程库。python中的多线程其实并不是真正的多线程,并不能做到充分利用多核CPU资源。 如果想要充分利用,在python中大部分情况需要使用多进程,那么这个包就叫...

_周小董
2017/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部