pythonasyncore异步IO由python标准库学习

# -*- coding: utf-8 -*-

# python:2.x

__author__ = ‘Administrator‘

import asynchat,asyncore,logging,socket

#asyncore异步IO

#作用:异常IO处理

#功能是处理IO对象,如套接字,从而能异步管理这些对象(而不是多个线程或者进程),包括类有dispatcher,这是一个套接字的包装器,提供了一些HOOK(钩子),从主循环函数loo()调用时可以处理连接以及读写事件

#服务器

#第一个类是ECHOServr

#它从客户接收到连接,一旦接受连接,将关闭演示,可以更容易的开始和结束服务器

class ECHOServr(asyncore.dispatcher):

def __init__(self,addres):

self.logger=logging.getLevelName(‘ECHOServr‘)

asyncore.dispatcher.__init__(self)

self.create_socket(socket.AF_INET,socket.SOCK_STREAM)

self.bind(addres)

self.address=self.socket.getsockname()

self.logger.debug(‘binding to %s‘%(self.address))

self.listen(1)

def handle_accept(self):

client_INto=self.accept()

self.logger.debug(‘accpet()->%s‘%(client_INto[1]))

EChoHandler(sock=client_INto[0])

self.handle_close()

return

def handle_close(self):

self.logger.debug(‘handle_close()‘)

return

"""

handle_accept()每次接受一个新连接,ECHOServr会创建一个新的EChoHandler实例来管理这个连接,EChoHandler,ECHOServr

在不同的类中定义,因为它们完成不同的工作,ECHOServr接受一全连接一个新的套接字,并非在EChoHandler中将这个套接字分派到单个客户,而是会创建一个EChoHandler

,从而充分利用由asyncore维护套接字映射

"""

class EChoHandler(asyncore.dispatcher):

def __init__(self,sock,chunk_size=256):

self.chunk_size=chunk_size

logger_name=‘EchoHandIer‘

self.logger=logging.getLevelName(logger_name)

asyncore.dispatcher.__init__(self,sock=sock)

self.data_to_write=[]

return

def writable(self):

respone=bool(self.data_to_write)

self.logger.debug(‘%s‘%(respone))

return respone

def handle_write(self):

data=self.data_to_write.pop()

sent=self.send(data[:self.chunk_size])

if sent<len(data):

remaing=data[sent:]

self.data_to_write.append(remaing)

self.logger.debug(‘%d %r‘%(sent,data[:sent]))

if not self.writable():

self.handle_close()

def handle_close(self):

self.logger.debug(‘handle_close()‘)

self.close()

def handle_read(self):

data=self.recv(self.chunk_size)

self.logger.debug(‘%d %r‘%(len(data),data))

self.data_to_write.insert(0,data)

#客户端

#基于asynoce创建一个客户,需要派生dispatcher,并提供实现完成套接字创建和读取,对于EchoClient,可以使用create_socket()在__init__()中创建套接字,也可以提供这个方法其他实现

class EchoClient(asyncore.dispatcher):

def __init__(self,host,port,message,chunk_size=128):

self.message=message

self.to_send=message

self.received_data=[]

self.chunk_size=chunk_size

self.logger=logging.getLevelName(‘EchoClient‘)

asyncore.dispatcher.__init__(self)

self.create_socket(socket.AF_INET,socket.SOCK_STREAM)

self.logger.dubug(‘%s‘%(host,port))

self.connect((host,port))

return

def handle_close(self):#hook只是为了它何时得到的调用,其他类型的客户如果需要实际连接握手或者协议协商,则在这个方法呷完成这个工作

self.logger.debug(‘ handle_close()‘)

#下面的handle_close()同样是为了显示它在处理期间何时得到调用,基类中这个方法正确关闭了套接字,如果应该不需要在关闭时做额外的清理工作,这不需要这个方法

def handle_close(self):

self.logger.debug(‘ handle_close()‘)

self.close()

received_message=‘‘.join(self.received_data)

if received_message==self.message:

self.logger.debug(‘RECEIVED COPY OF MESSAGE‘)

else:

self.logger.debug(‘ERROR IN‘)

self.logger.debug(‘%s‘%(self.message))

self.logger.debug(‘%s‘,received_message)

return

def writable(self):#和它的对应方法readable()来确定对每个分派器做何处理,对于各个分派器管理套接字或者文件描述符,poll()或者select()的具体使用在asynoce代码中处理, 不需要在程序使用asynoce实现,这种程序只需要指示分派器希望是读,还是写数据,在这个客户中,只要有数据发到服务器,writeable()返回True,readable()只是True

self.logger.debug(‘%s‘%bool(self.to_send))

return bool(self.to_send)

def readable(self):

self.logger.debug(‘True‘)

return True

#每次通过循环处理时,如果writable()做出肯定的响应,就会调用handle_write(),EchoClients根据给定的大小限制将消息划分多个部分,来展示一个相当大的多部分消息是如何通过循环使用多次迭代进行传输的,每次调用handle_write(),会写下一部分消息,直到消息完全利用完毕

def handle_write(self):

sent=self.send(self.to_send[:self.chunk_size])

self.logger.debug(‘%d %r‘%(sent,self.to_send[:sent]))

self.to_send=self.to_send[sent:]

#类似的readable()做出响应,就调用handle_read()

def handle_read(self):

sent=self.recv(self.chunk_size)

self.logger.debug(‘%d %r‘%(len(sent),sent))

self.received_data.append(sent)

if __name__==‘__main‘:

logging.basicConfig(level=logging.DEBUG,format=‘%(name)-11s(message)s‘,)

address=(‘localhost‘,0)

server=ECHOServr(address)

ip,port=server.address

message=open(‘lorname.txt‘,‘r‘).read()

logging.info((‘%d‘),len(message))

click=EchoClient(ip,port,message=message)

asyncore.loop()

时间: 2024-12-14 18:52:58

pythonasyncore异步IO由python标准库学习的相关文章

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

【python标准库学习】re模块

1.什么是re 正则表达式一门相对通用的语言,在python中也有对正则表达式的支持,那就是的内置re模块.正则表达式就是一系列的规则去匹配字符串然后进行相应的操作,这些规则网上一搜一大片,而re则是运用正则表达式来提供一系列的功能强大的接口让我们来调用.通常我们在对日志文件进行操作的时候会对正则表达式运用的比较多来得到我们希望得到的数据. 2.python中的转义符 正则表达式中通常用反斜杠'\'来代表转义,'\d'代表数字等,但是python本身也是通过反斜杠'\'来表示转义,所以就和正则表

python标准库学习-random

想想这么多年,也是没有好好梳理一下自己的知识体系,以至于总是会有书到用时方恨少的遗憾. 最近既然有学习的动力,干脆就趁着这份工作不是特别忙的机会,写一点东西吧,也理理自己的逻辑思维能力. python有哪些库? 这个问题呢可以参照http://blog.csdn.net/python_wangjunji/article/details/8689297这篇博文来看. 当然咯,首先要先推荐一个可厉害的学习程序:Dash.学编程必备查询库,各种语言,专治"我要看源码病". 那第一篇呢,我就先

[学习笔记] Python标准库的学习准备 [转]

Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了解基本的计算机各个组成部分的性能. 操作系统 在了解操作系统时,下面是重点: 1) 操作系统的进程管理,比如什么是UID, PID, daemon 2) 进程之间

Python标准库的学习准备

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了解基本的计算机各个组成部分的性能. 操作系统

Python 标准库一览(Python进阶学习)

转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连应该用哪个类库都不知道,还要去百度(我不信就我一个人那么尴尬TvT) 好像自从学习了基础的Python 语法,看了几本Python经典的书,知道了一些常见的类库.在几本语法应用熟练的情况下,如果不做题,像是无法显著的提高自己的知识储备了(所以叫你去做python challenge啊,什么都不会~~

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

python标准库

ython拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XML处理等额外的功能.Python标准库命名接口清晰.文档良好,很容易学习和使用. Python社区提供了大量的第三方模块,使用方式与标准库类似.它们的功能无所不包,覆盖科学计算.Web开发.数据库接口.图形系统多个领域,并且大多成熟而稳定.第三方模块可以使用Python或者C语言编写.SWIG,SIP常用于