我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python中的asyncore

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python中的asyncore

在Python中,既可直接使用socket类,也可使用socketserver,asyncore等经过封装的类来进行编码。asyncore这个库中主要包含了两个函数:

  • asyncore.loop([timeout[, use_poll[, map[, count]]]])

  • class asyncore.dispatcher

Eventdescription
handle_connect()Implied by the first read or write event
handle_close()Implied by a read event with no data available
handle_accepted()Implied by a read event on a listening socket

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

我们定义一个类,它继承dispatcher类,然后我们重写基类的方法。每个继承dispatcher类的对象,都可以看做我们需要处理的一个socket,可以TCP也可以是UDP,甚至是一些不常用的。

这是标准文档中的一个例子。

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 = bytes('GET %s HTTP/1.0\r\nHost: %s\r\n\r\n' %
                            (path, host), 'ascii')
    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()

dispatcher类中的writable和readable在检测到一个socket可以写入或者数据到达的时候被调用,并返回一个bool值,决定是否调用handle_read或者handle_write。打开asyncore.py可以看到,dispatcher类中定义的方法writable和readable的定义相当的简单:


def readable(self):
    return True
def writable()
    return True

也就是说,一旦检测到可读或可写,就调用handle_read/handle_write,但在这个例子中重写了父类的writable方法,

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。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python中的asyncore

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python中的asyncore

在Python中,既可直接使用socket类,也可使用socketserver,asyncore等经过封装的类来进行编码。asyncore这个库中主要包含了两个函数:asyncore.loop([timeout[, use_poll[, m
2023-01-31

python中asyncore异步模块的实现

本文主要介绍了python中asyncore异步模块的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-18

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

基础 这个模块是socket的异步实现,让我们先来熟悉一下模块中的一些类和方法: 1.asyncore.loop 输入一个轮询循环直到通过计数或打开的通道已关闭。 2.asyncore.dispatcher dispatcher类是一个底层
2022-06-04

Python asyncore socket客户端开发基本使用教程

asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构,这篇文章主要介绍了Python asyncore socket客户端开发基本使用,需要的朋友可以参考下
2022-12-26

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

Asyncore模块提供了以异步的方式写入套接字服务客户端和服务器的基础结构。 只有两种方式使一个程序在单处理器上实现“同时做不止一件事”。多线程编程是最简单和最流行的方式,但是有另一种很不一样的技术,可以使得我们保持多线程的几乎所有优势,
2022-06-04

[Python ] python中文件的

原文地址: http://blog.163.com/qimeizhen8808@126/ 这女孩写的挺好,有值得学习的地方。  1) 文件的打开和创建,关闭 a)文件的打开和创建主要有两个open()和file()两个方法。它们的功能是提供
2023-01-31

python中的类

关键字:class含义:带有某些属性和方法的一个集合,可以理解成模板。object的概念:类的实例。以对应类为模板,创建出来的对象。如何理解python中的self?1 实例本身,对象。2 可以理解为一个字典变量,内部存的就是对象的数据属性
2023-01-31

python中的import

python中的import操作有点类似于C语言中的#include,但又有很大的不同。在c语言中,#include是编译前将另一个文件包含进当前文件中。在python中导入并非只把一个文件文本插入另一个文件而已。导入其实是运行时的运算,程
2023-01-31

python中的logging

python logging模块可能会令人困惑的地方通过参阅python logging模块的代码,发现一些有趣的现象: 1. logging对象其实是一个树形结构,每个创建的logging对象都是root logging对象的孩子结点。当
2023-01-31

python中的struct

我们知道python只定义了6种数据类型,字符串,整数,浮点数,列表,元组,字典。但是C语言中有些字节型的变量,在python中该如何实现呢?这点颇为重要,特别是要在网络上进行数据传输的话。python提供了一个struct模块来提供转换。
2023-01-31

python中的setdefaulten

http://blog.csdn.net/magicharvey/article/details/20055949主题 Python #!/usr/bin/env python #encoding: utf-8 import sys
2023-01-31

python中的__call__

如果python中的一个类定义了 __call__ 方法,那么这个类它的实例就可以作为函数调用,也就是实现了 () 运算符,即可调用对象协议    下面是一个简单的例子:class TmpTest: def __init__(self
2023-01-30

python中的whitespace

python中strip()和split()在无参数的情况下使用whitespace做为默认参数,在帮助文档中对whitespace的解释为6个字符,它们是space, tab, linefeed, return, formfeed, an
2023-01-31

Python中的threading

#!/usr/bin/env python# -*- coding: utf-8 -*-import threading, time#新线程执行的代码:def loop():    print('thread %s is running..
2023-01-31

python中的basestring

basestring()说明:basestring是str和unicode的超类(父类),也是抽象类,因此不能被调用和实例化,但可以被用来判断一个对象是否为str或者unicode的实例,isinstance(obj, basestring
2023-01-31

python中的input

python中的input()方法是在控制台可以自己输入数据比如 :定义变量a = 2 现在可以写成 a = input() 可以自己输入变量a的值注意:input()返回的值是str字符型的如果要让输入的数字变为整形,可以使用int()方
2023-01-31

python中的subprocess

python2.7 源码中的注释(由于能力有限,翻译的不太准确):这个模块允许您开启进程、连接输入、输出和错误的管道,并获取他们的返回代码。这个模块计划替代一些旧代码,如:os.system、os.spawn*、os.Popen、popen
2023-01-31

python中的rabbitmq

RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入
2023-01-30

Python中的bytes

bytes_lst = [  ('创建bytes',),  ('bytes可哈希',),  ('编码与解码',),  ('常见编码类型',),  ('ord() 与 chr()',),] 创建bytes  >>>b = bytes('hi'
2023-01-30

Python中的dict

# dict# Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。d = {'Michael': 95, 'Bob': 75, 'T
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录