Discuss / Python / 关于分布式的比喻式理解,有助大家理解.不对的地方,还望谅解.不求完全正确,只求更加方便的理解

关于分布式的比喻式理解,有助大家理解.不对的地方,还望谅解.不求完全正确,只求更加方便的理解

Topic source

JOIEUH

#1 Created at ... [Delete] [Delete and Lock User]

代码就是教程的,因为代码过长,我就直接截取,那些重要的讲

前面1~9, 是关于task_master.py的解析
10~33, 是关于task_worker.py的解析

1.创建Queue的实例

task_queue = queue.Queue()
result_queue = queue.Queue()

2.为了让QueueManager拥有BaseManager这个父类的全部方法

class QueueManager(BaseManager):
    pass

3.这里可以理解问"注册迅雷帐号"(非广告,用迅雷作比喻方便后面讲解) 账户名:get_task_queue, 注册人(理解为实名认证,就是callable): task_queue

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)

4.相当于迅雷的密码 特定的接口(理解为密码): 5000 authkey: 相当于验证码

manager = QueueManager(address=('', 5000), authkey=b'abc')

5.链接网络(虽然不太恰当)

manager.start()

6.通过账户和密码登陆迅雷 manager,在前面的4中就是相当于密码 get_task_queue(),在前面3中相当于账号 所以,manager.get_task_queue(),就相当于通过账户和密码登陆迅雷

task = manager.get_task_queue()
result = manager.get_result_queue()

7.这里需要特别注明的,也是很重要的一点 为什么我们需要进行前面的2,3,4,5,6步呢? 就是为了,把Queue注册到网络上

原文的解析如下:

请注意,当我们在一台机器上写多进程程序时,创建的Queue可以直接拿来用,但是,在分布式多进程环境下,添加任务到Queue不可以直接对原始的task_queue进行操作,那样就绕过了QueueManager的封装,必须通过manager.get_task_queue()获得的Queue接口添加。

所以才需要进行2,3,4,5,6步,来把Queue注册到网络上.然后通过帐号和密码登陆之后才能访问到原始的task_queue

给迅雷添加下载链接,就是task.put(n)

for i in range(10):
    n = random.randint(0, 10000)
    print('Put task %d...' % n)
    task.put(n)

8.这段为了最后打印出结果,没什么好解析的 那个timeout=10,我也不知道用来干嘛,懂得同学求解?

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

9.注销账号

manager.shutdown()
print('master exit.')

10.为了让QueueManager拥有BaseManager这个父类的全部方法(同2)

class QueueManager(BaseManager):
    pass

11.大家都知道迅雷可以一个帐号,在两台设备上同时登陆吧.(这就是为什么要用迅雷做例子)

这里的QueueManager.register就可以理解为你的朋友分享他的帐号给你.

为什么没有,lambda: task_queue,因为是你朋友借帐号给你登陆,你不需要实名认证

文章解析: 由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字

QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

12.server_addr可以理解为帐号的安全问题. 因为是第二个设备登陆.所以需要回答安全问题. 只有回答对了答案才可以登陆,而这个答案就是Ip地址,也是本文中的,127.0.0.1

server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)

13.相当于,密码

为什么需要设置为同样的5000,和b'abc'

其实就是密码,你想想,前面11得到了你朋友的帐号 而他的密码是在之前,也就是4的时候设置好的

这就好比你有账号,那么是不是也需要正确密码才能成功登陆呢?

m = QueueManager(address=(server_addr, 5000), authkey=b'abc')

14.登陆

m.connect()

15.相当于凭借账户密码登陆.和前面6一样

而左边的task和result可以理解为账户昵称(ID)

task = m.get_task_queue()
result = m.get_result_queue()

16.这个没什么好解析的,其实就是前面章节的内容,看不懂的就要回去前面看看了.(咦...怎么好像在自己啊)

再求教,这个timeout=1,是干嘛的?

for i in range(10):
    try:
        n = task.get(timeout=1)#获取前面7放进去的链接
        print('run task %d * %d...' % (n, n))
        r = '%d * %d = %d' % (n, n, n*n)
        time.sleep(1)
        result.put(r)#前面操作完后,把r放进result
    except Queue.Empty:#这个写错了吗?也求解.有同学说是queue.empty
        print('task queue is empty.')

17.task_worker.py的第16,result.put(r),就在task_result.py中的8,打印出结果的

JOIEUH

#2 Created at ... [Delete] [Delete and Lock User]

task_master.py就是

* 注册
    * 账户
    * 密码,
    * 进去设置昵称task和result
    * 分配下载任务
    * 下载完后注销账户

task_worker.py就是

* 获取账户
* 回答安全问题,就是ip
* 获取密码
* 登陆
* 设置昵称task和result
* 分配任务

关于timeout=10 我认为是设置一个超时的时间,防止访问过长影响运行效率


  • 1

Reply