asyncio文档学习——消息循环EventLoop例子3

#coding:utf-8
import asyncio
try:
    from socket import socketpair
except ImportError:
    from asyncio.windows_utils import socketpair
    

#Create a pair of connected file descriptors
'''
创建一对连接的socket对象,应有三个参数:地址簇;socket类型;协议号。
这里没有给定,为默认参数,地址簇: AF_INET(Ipv4);socket类型: SOCK_STREAM(基于TCP的可靠数据报);协议号:0(表示所选类型的缺省协议将被使用。)。
'''
rsock,wsock = socketpair()
loop = asyncio.get_event_loop()

def reader():
    '''
    从socket中接收数据。返回值将接收的数据以字节对象的形式显示。
    一次性接收的最大数据量是由bufsize指定的。
    参见Unix手册页recv(2),以了解可选参数flags的含义,默认值为0.
    bufsize的值应该是2的相对较小的幂,例如4096。
    '''
    data = rsock.recv(3)
    print("Received:",data.decode())
    #We are done:unregisted the file descriptor
    '''
    停止监视文件描述符以获取可用性。
    '''
    #print(rsock)
    loop.remove_reader(rsock)
    #Stop the event loop
    loop.stop()
    
#Register the file descriptor for read event
'''
AbstractEventLoop.add_reader(fd, callback, *args)
先查看文件标识符有效性,然后携带特定参数调用回调函数
使用functools.partial去传递关键字给回调函数
'''
loop.add_reader(rsock,reader)

#simulate the reception of data from the network
'''
安排一个回调函数,它将尽快地被调用。当控制器返回一个事件环时,这个回调函数将在call_soon()返回值之后就被调用
这个操作像一个先进先出队列,回调函数按注册的顺序被调用。每一个回调函数都将只被调用一次。
回调函数之后任何位置的参数都将在回调函数被调用时传递给回调函数
返回一个asyncio.Handle的示例,他可以被用来取消回调
使用functools.partial去传递关键字给回调函数
非线程安全
'''
loop.call_soon(wsock.send,'abc'.encode())

#run the event loop
'''
运行到调用stop()
1.stop......run_forever:轮询I/O选择器直到0超时,运行所有已经被调度的回调函数去响应I/O事件包括那些被调度过的,然后退出
2.stop-run_forever:运行当下回调队列,退出。注意被回调调度过的回调不会在此时运行,他们会在下一次run_forever时运行
'''
loop.run_forever()

#We are done,close sockets and the event loop
rsock.close()
wsock.close()
'''
关闭事件环。事件环必须已经停止。挂起的回调函数会丢失。
清空队列同时切断执行,不会等待执行结束。
这是幂等的,不可逆的。
    在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.
在此方法之后没方法可以再被调用。
'''
loop.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值