zoukankan      html  css  js  c++  java
  • 协程demo,1异步爬网页 2异步socket请求

    一、异步爬网页

    '''
    协程并发爬网页
    '''
    from urllib import request
    import gevent,time
    from gevent import monkey  # 让gevent知道urllib里的哪些操作属于IO操作
    
    monkey.patch_all()   # 标记当前程序所有的IO操作
    
    def f(url):
        print("GET:{0}".format(url))
        resp = request.urlopen(url)
        data = resp.read()
        print('{0} bytes received from {1}'.format(len(data), url))
    
    time_start = time.time()
    f("https://www.python.org")
    f("https://www.yahoo.com")
    f("https://github.com")
    print("同步耗时:{0}".format(time.time()-time_start))
    
    async_time_start = time.time()
    gevent.joinall([gevent.spawn(f,"https://www.python.org"),
                    gevent.spawn(f, "https://www.yahoo.com"),
                    gevent.spawn(f, "https://github.com")])
    print("异步耗时:{0}".format(time.time()-async_time_start))
    
    '''
    GET:https://www.python.org
    49060 bytes received from https://www.python.org
    GET:https://www.yahoo.com
    498196 bytes received from https://www.yahoo.com
    GET:https://github.com
    64978 bytes received from https://github.com
    同步耗时:10.61960744857788
    GET:https://www.python.org
    GET:https://www.yahoo.com
    GET:https://github.com
    86167 bytes received from https://github.com
    49060 bytes received from https://www.python.org
    503102 bytes received from https://www.yahoo.com
    异步耗时:3.7582149505615234
    '''

    二、异步处理socket请求

    服务端:

    import socket
    import gevent
    from gevent import monkey
    
    monkey.patch_all()
    
    def server(port):
        s = socket.socket()
        s.bind(('0.0.0.0', port))
        s.listen(500)
        while True:
            cli, addr = s.accept()  # 之前多并发是启动一个线程
            gevent.spawn(handle_request, cli)
    
    def handle_request(conn):
        try:
            while True:
                data = conn.recv(1024)
                print("recv:", data)
                conn.send(data)
                if not data:
                    conn.shutdown(socket.SHUT_WR)
        except Exception as ex:
            print(ex)
        finally:
            conn.close()
    
    if __name__ == '__main__':
        server(8001)

    客户端:

    import socket
    
    HOST = 'localhost'
    PORT = 8001
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    while True:
        msg = bytes(input(">>").strip(), encoding="utf-8")
        s.sendall(msg)
        data = s.recv(1024)
        print("Received:", repr(data))
    s.close()
  • 相关阅读:
    Python中if __name__ == '__main__':作用
    mac 用macports给python装opencv
    (转)学习&使用技术的四种层次
    图像处理入门,一些简单的基于像素几何变换和实现
    基于水平投影,垂直投影的字符图像分割思路和代码实现
    转:Cannot make a static reference to the non-static解决办法
    BP神经网络学习和c++例子程序代码
    python中初始化一个数组用来存储多张图片
    假期第二周周总结
    假期第一周周总结
  • 原文地址:https://www.cnblogs.com/staff/p/9704166.html
Copyright © 2011-2022 走看看