`
androider
  • 浏览: 748063 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

asyncore.py

阅读更多
asyncore库是python的一个标准库,它是一个异步socket的包装。我们操作网络的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的操作网络,避免直接使用socket,select,poll等工具时需要面对的复杂。

这个库很简单,包含了一个函数和一个类
* loop()函数
* dispatcher基类
需要注意的是,loop函数是全局的,不是dispatcher的方法

每一个从dispatcher继承的类的对象,都可以看作我们需要处理的一个socket,可以是TCP连接或者UDP,甚至是其它不常用的。使用容易,我们需要定义一个类,它继承dispatcher,然后我们重写(覆盖)一些方法就可以了。

我们需要重写的方法一般都以handle_打头。
class refuse(dispatcher):

def handle_accept():
#do nothing ...
pass

loop()函数负责检测一个dict,dict中保存dispatcher的实例,这个字典被称为channel。每次创建一个dispatcher对象,都会把自己加入到一个默认的dict里面去(当然也可以自己指定channel)。当对象被加入到channel中的时候,socket的行为都已经被定义好,程序只需要调用loop(),一切功能就实现了。

asyncore是python标准库中的一个良好的设计
在python的标准文档中,有一个asyncore的例子
import asyncore, socket


class http_client(asyncore.dispatcher):

def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect( (host, 80) )
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path

def handle_connect(self):
pass

def handle_close(self):
self.close()

def handle_read(self):
print self.recv(8192)

def writable(self):
return (len(self.buffer) > 0)

def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]

c = http_client('www.python.org', '/')

asyncore.loop()

运行这个函数,发现python.org的首页被下载下来了,也就是说我们实现了一个http层的协议?但是我们用的仅仅是socket级别的API...那么来看看这几行代码的奥妙吧!

writable和readable在检测到一个socket可以写入或者检测到数据到达的时候,被调用,并返回一个bool来决定是否handle_read或者handle_write

打开asyncore.py可以看到,dispatcher类中定义的方法writable和readable的定义相当的简单:
    def readable(self):

return True

def writable(self):
return True

就是说,一旦检测到可读或可写,就直接调用handle_read/handle_write,但是在上面的例子中,我们却看到了一个重载(看上去像C++的虚函数,不是吗?)
    def writable(self):

return (len(self.buffer) > 0)

很明显,当我们有数据需要发送的时候,我们才给writable的调用者返回一个True,这样就不需要在handle_write中再做判断了,逻辑很明确,代码很清晰,美中不足的是理解需要一点时间,但是不算困难吧!

其余的代码看起来就很清晰了,有一种并来将挡的感觉。当一个http服务器发送处理完成你的请求,close socket的时候,我们的handle_close()也相应完成自己的使命。close()将对象自身从channel中删除,并且负责销毁socket对象。
    def close(self):

self.del_channel()
self.socket.close()

loop()函数检测到一个空的channel,将退出循环,程序完成任务,exit。
分享到:
评论

相关推荐

    跨平台python异步回调机制实现和使用方法

    1 将下面代码拷贝到一个文件,命名为asyncore.py 复制代码 代码如下:import socketimport selectimport sys def ds_asyncore(addr,callback,timeout=5): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s....

    Python3.6 内置.py模块列表及功能概述.pdf

    Python3.6内置.py模块是Python标准库的一部分,这些模块提供了许多核心功能和工具,方便开发者进行各种编程任务。以下是一些重要的内置模块及其功能概述: 1. **__future__**:这个模块定义了未来语句(Future ...

    Python中asyncore异步模块的用法及实现httpclient的实例

    Python中的`asyncore`模块是Python标准库中用于构建异步网络应用的一个工具,它提供了对低级socket接口的封装,使得开发者能够方便地编写基于事件的多路复用网络程序。`asyncore`的核心是`dispatcher`类,它是对...

    ParaSite-开源

    3. asyncore.py 和 asynchat.py:这两个是Python标准库中的异步网络通信模块,用于构建高度并发的网络服务器和客户端。asyncore提供了基本的事件驱动网络通信框架,而asynchat则增加了对更复杂协议的支持,如带有...

    Python的Asyncore异步Socket模块及实现端口转发的例子

    ### Python的Asyncore异步Socket模块及其实现端口转发的应用 #### 一、Asyncore模块简介 在Python中,`asyncore`模块为开发者提供了一种基于异步IO的框架,用于处理网络通信中的多路复用问题。相较于传统的多线程...

    aiosmtpd:基于asyncio的Python stdlib smtpd.py的重新实现

    asyncore和asynchat是难以使用,理解,扩展和修复的API。 随着Python 3.4中引入模块,现在提供了一种更好的异步I / O方法。 显然,Python 3需要基于SMTP的版本和相关协议。该项目将一些经验丰富的Python开发人员...

    src_based_on_socket.zip

    该聊天系统的代码的基础是 Python 的 asyncore 模块(它提供了以异步的方式写入套接 字服务的客户端和服务器的基础结构)。采用 Socket 通信这一种比较原始的方案实现 RPC 框架。 这个聊天系统有两份 python 文件...

    python模块详解

    7.4. asyncore 模块 7.5. asynchat 模块 7.6. urllib 模块 7.7. urlparse 模块 7.8. cookie 模块 7.9. robotparser 模块 7.10. ftplib 模块 7.11. gopherlib 模块 7.12. httplib 模块 7.13. poplib 模块 ...

    coles_scraper

    Python 在数据抓取方面有很多优秀库,如 requests 库用于发送网络请求,BeautifulSoup 或 lxml 用于解析 HTML,pandas 用于数据处理,以及可能的 asyncore 或 asyncio 库用于实现异步请求,提高爬虫效率。...

    py38-test

    10. **弃用和删除**: Python 3.8中也有一些过时特性的弃用,比如`asyncore`和`asynchat`模块,它们将在未来的版本中被删除。 这些只是Python 3.8中的一部分重要更新。通过分析这个名为“py38-test”的项目,我们...

    Transmit-with-Cipher:流量简单加密的端口转发

    Transmit-with-Cipher PY使用asyncore实现的一个简单端口转发,可选流量RC4

Global site tag (gtag.js) - Google Analytics