python异步socket
1. python中两种网络编程方式:Socket和HTTP协议
在Python网络编程领域,Socket和HTTP协议是两大核心手段。本文将深入探讨这两种方式,带你从实际应用角度理解它们。
首先,Socket编程作为基础,是实现网络通信的核心模块。Python的socket模块让Socket编程变得直观易用。通过示例,你能构建一个简单的Socket服务器,客户端可以连接并接收消息,适用于即时通讯和文件传输等场景。
接着,HTTP协议更偏向于应用层,是超媒体文档传输的常用协议。Python的requests库简化了HTTP通信,例如GET和POST请求的发送与响应处理。在Web开发和API交互中,HTTP协议的应用更为广泛。
在实际应用中,Socket编程可利用多线程处理多个客户端请求,提高并发性能。Python的threading模块支持多线程,便于高效地同时处理多个连接请求。
总的来说,Python通过Socket和HTTP协议提供了丰富的网络编程手段。Socket适合定制化通信,HTTP则方便与Web服务交互。理解并掌握这两种技术,对于开发网络应用至关重要。通过本文,你将对这两种网络编程方式有更深的理解和实践能力。
2. python gevent 每个socket 的消息接收是否有使用事件监听回调的方法
gevent 比起其他框架(比如tornado,twisted)的一个巨大优势就是:用同步的方法(自然没有回调函数)写异步应用,因为同步的方式更接近开发人员的编程思维。
gevent可以用一句话向pythoner阐述:使用多路IO复用对文件描述符的事件监听,从而撬动协程的“透明”切换。这句话说起来容易,但是阐述起来就复杂些:
底层(或者说主协程)自然有一个多路IO复用循环(linux上是epoll,unix是kqueue,以下统一用epoll代替描述)
当处理一个socket链接时,就创建一个协程greenlet去处理。
当socket遇到阻塞的时候,比如等待数据的返回或者发送,此时gevent做了很关键的两步:
为这个socket的fd在epoll上添加可读或者可写事件回调,而这个回调函数便是 gevent.getcurrent().switch
通过 get_hub().switch() 切换到主协程。切换回主协程,去干其他事情了。但是当该socket可读或者可写,epoll自然会调用上述添加的回调函数,从而切换回socket的处理协程,从上次悬挂点接着往下执行。
之所以做到透明,是因为python socket上打了patch。所谓打patch,就是自己实现了一个socket模块替换了python的标准socket模块。