学习python爬虫的时候,正好看到要用到分布式的案例。
于是自己直接拿来用了。
类似的代码网上一大堆。
先贴出代码
- taskManager.py
‘’’
import random, time
import queue #队列在py2中 'q' 大写 在py3中小写
from multiprocessing.managers import BaseManager
#setp 1:建立task_queue和result_queue,用来存放任务和结果
task_queue = queue.Queue()
result_queue = queue.Queue()
class QueueManager(BaseManager):
pass
#setp 2:把创建的两个队列注册在网络上,利用register方法,callable参数关联了Queue对象,将Queue对象在网络中暴露.
QueueManager.register('get_task_queue', callable=lambda:task_queue)
QueueManager.register('get_result_queue', callable=lambda:result_queue)#callable对应的是一个函数
#setp 3:绑定端口8080,设置验证口令'hello'.这个相当于对象初始化
manager = QueueManager(address=('127.0.0.1', 8080), authkey='hello'.encode('utf-8'))
#setp 4:启动管理,监听信息通道
manager.start()
#setp 5:通过管理器实例方法获得通过网络访问的Queue对象
task = manager.get_task_queue()
result = manager.get_result_queue()
#setp 6:添加任务
for url in ['ImageUrl_'+str(i) for i in range(10)]:#列表推导式,好家伙,多用
print('put task {}'.format(url));
task.put(url)
#获取返回结果
print('try get result')
for i in range(10):
print('result is {}'.format(result.get(timeout=10)))#Queue.get() -> pop value
#关闭管理
manager.shutdown()
‘’’
- taskWorker.py
‘’’
#!coding=utf-8
import time
from multiprocessing.managers import BaseManager
#创建类似的QueueManager
class QueueManager(BaseManager):
pass #继承了类
#setp 1:使用QueueManager注册用于获取Queue的方法名称
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')
#setp 2:连接到服务器
server_addr = '192.168.8.194'
#erver_addr = '127.0.0.1'
print('Connect to server {} ...'.format(server_addr))
#端口和验证口令注意保持与服务进程完全一致
m = QueueManager(address=(server_addr, 6500))#, authkey='hello'.encode('utf-8'))
#从网络连接
m.connect()
#step 3:获取Queue对象
task = m.get_task_queue()
result = m.get_result_queue()
#setp 4:从task队列中获取任务,并把结果写入result队列
while(not task.empty()):
image_url = task.get(True, timeout=5)
print('run task download {} ...'.format(image_url))
time.sleep(1)
result.put('{}---->success'.format(image_url))
‘’’
- 相信有python基础的都能看的懂。
成功的实验
首先配置一下taskWorker.py中的ip地址,如果懒的配就把server_addr直接设置成server_addr='localhost’就行了,taskWorker.py中的server_addr设置成和taskWorker.py中的一样就行了。
然后我把这两个脚本放在一台电脑中运行,没有问题,一切都很正常。
具体现象就不贴出来了,相信把上面两个脚本运行一下就行了。
失败的实验
.因为是要了解分布式。当然要在不同的电脑上试试了。
刚好身边有两台电脑~~~,于是我把上述两个脚本分别放在两台电脑上运行。
……问题来了,无论我怎么实验都没有通信成功。
迷之原因
我又看了些进程间通信的文章,发现大都提到子进程间通信。这下有点明白了。
两台主机的进程是两个完全互相独立的进程,没有父子关系,也没有兄弟之情。所以是不能用队列直接进行通信的,
而上述的通信手段就是使用队列。这个时候就需要使用消息中间件了。比如rabbitMQ。
怪就怪涉世未深。