python每日一题:分布式进程之坑点

1.看{python爬虫开发与项目实战}中关于分布式进程的介绍,一直卡在这个知识点,书中的这个例子描述是在不同电脑上进行运行的,但这里有一个前提:两台电脑的网段需相同,所以,编程练习时,对着两台电脑一直找问题,始终没解决。

2.书中关于ip地址是127.0.0.1,这个地址是回环地址,在同一台机器上,开两个cmd 或者pycharm输入书中的程序可以进行数据传输,另外也可以改成自己电脑的ip(我的192.168.103.130),在同一台电脑上运行

3.自己思考了一段时间,书中的例子其实是为了采用网络队列进行不同电脑的数据交互,但不同的电脑网段需相同。我这里不满足要求,索性用了一台电脑进行数据交互,开两个程序,相当于开了两个进程,也属于分布式进程,但比较特殊罢了

题目:采用分布式进程,一台电脑a进行传输一系列的网址,另一台电脑b分别打开网址,并返回相应的网址字节数。

服务器端:

from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
import  queue
task_number=3
task_queue = queue.Queue()
result_queue = queue.Queue()
list1=['http://baidu.com','http://xiaomi.com','http://huawei.com']
def get_task():
    global task_queue
    return task_queue
def get_result():
    global result_queue
    return result_queue
class QueueManager(BaseManager):
    pass
def win_run():
    QueueManager.register('get_task_queue', callable=get_task)
    QueueManager.register('get_result_queue', callable=get_result)
    manager =QueueManager(address=('192.168.103.130', 20001), authkey=b'qiye')
    manager.start()
    try:
        task = manager.get_task_queue()
        result = manager.get_result_queue()
        for i in list1:
            print('transparenting url:', i)
            task.put(i)
        print('try to get the details of url')
        print('the url details is as follows:')
        for i in range(len(list1)):
            print(list1[i],":", result.get(True, timeout=20))
    except:
        print('manger is error')
    finally:
        manager.shutdown()
if __name__ == "__main__":
    freeze_support()
    win_run()

客户端:

from multiprocessing.managers import BaseManager
import  queue,time,urllib.request
class QueueManager(BaseManager):
    pass
if __name__ == "__main__":
    list1=[]
    list2=[]
    QueueManager.register('get_task_queue')
    QueueManager.register('get_result_queue')
    m =QueueManager(address=('192.168.103.130', 20001), authkey=b'qiye')
    m.connect()
    task=m.get_task_queue()
    result=m.get_result_queue()
    while(not task.empty()):
        imageurl=task.get(True,timeout=20)
        list1.append(imageurl)
        print('opening ',imageurl)
        a=urllib.request.urlopen(imageurl)
        data=a.read()
        b=len(data)
        print( imageurl,'the url data is',b)
        list2.append(b)
        result.put(b)
    print('game over')

调试结果:本程序是在同一台电脑打开两个程序运行的

服务器端:

transparenting url: http://baidu.com
transparenting url: http://xiaomi.com
transparenting url: http://huawei.com
try to get the details of url
the url details is as follows:
http://baidu.com : 81
http://xiaomi.com : 324657
http://huawei.com : 128494

客户端:

opening  http://baidu.com
http://baidu.com the url data is 81
opening  http://xiaomi.com
http://xiaomi.com the url data is 324657
opening  http://huawei.com
http://huawei.com the url data is 128494
game over
原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/10268813.html