一、异步爬网页
‘‘‘协程并发爬网页‘‘‘from urllib import requestimport gevent,timefrom 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.org49060 bytes received from https://www.python.orgGET:https://www.yahoo.com498196 bytes received from https://www.yahoo.comGET:https://github.com64978 bytes received from https://github.com同步耗时:10.61960744857788GET:https://www.python.orgGET:https://www.yahoo.comGET:https://github.com86167 bytes received from https://github.com49060 bytes received from https://www.python.org503102 bytes received from https://www.yahoo.com异步耗时:3.7582149505615234‘‘‘
二、异步处理socket请求
服务端:
import socketimport geventfrom gevent import monkeymonkey.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 socketHOST = ‘localhost‘PORT = 8001s = 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()
协程demo,1异步爬网页 2异步socket请求
原文地址:https://www.cnblogs.com/staff/p/9704166.html