zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Twisted
    day10-redis操作
    day9mysql操作
    day9-paramiko
    day10-rabbitmq
    day9-协程
    day8-异常
    Linux 软连接
    nginx 配置篇
    ansilbe基础学习(一)
  • 原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/10268813.html
Copyright © 2011-2022 走看看