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

来源:互联网 发布:mysql pdf 微盘 编辑:程序博客网 时间:2024/06/05 00:34
#coding:utf-8
import asyncio
import datetime
def display_date(end_time,loop):
    print(datetime.datetime.now())
    if(loop.time()+2)<end_time:
        #1.为什么间隔时间越长,执行时间越长2.无论时间到否,到最后时间会在输出一次
        '''
        延迟调用
            消息循环拥有自己内置的时钟用来计算超时。使用哪个时钟依赖于具体平台的消息循环实现,
            理想上它是一个单调一致性的时钟。这个时钟通常不同于time.time()
            超时(相对时延和绝对时间)应该不超过一天。
            AbstractEventLoop.call_later(delay, callback, *args)
            将被调用的回调函数安排在一个给出的延时秒数后(int或float都行)
            返回asyncio.Handle(回调包装器对象)的一个实例,它将被用来取消回调。
            每次call_later()中只会调用一次回调函数。如果两个回调函数同时被调度,没有定义谁将优先。
            可选的位置参数将在调用回调函数时传递给回调函数。如果你想要在调用回调函数传递一些已经命名的参数,使用一个闭包或者functools.partial()。
            使用functools.partial()传递关键字给回调函数
        '''
        loop.call_later(2,display_date,end_time,loop)
    else:
        loop.stop()
        
loop = asyncio.get_event_loop()
'''
安排一个回调函数,它将尽快地被调用。当控制器返回一个事件环时,这个回调函数将在call_soon()返回值之后就被调用
这个操作像一个先进先出队列,回调函数按注册的顺序被调用。每一个回调函数都将只被调用一次。
回调函数之后任何位置的参数都将在回调函数被调用时传递给回调函数
返回一个asyncio.Handle的示例,他可以被用来取消回调
使用functools.partial去传递关键字给回调函数
非线程安全
'''
end_time = loop.time()+5.0
loop.call_soon(display_date,end_time,loop)
'''
运行到调用stop()
1.stop......run_forever:轮询I/O选择器直到0超时,运行所有已经被调度的回调函数去响应I/O事件包括那些被调度过的,然后退出
2.stop-run_forever:运行当下回调队列,退出。注意被回调调度过的回调不会在此时运行,他们会在下一次run_forever时运行
'''
loop.run_forever()
'''
关闭事件环。事件环必须已经停止。挂起的回调函数会丢失。
清空队列同时切断执行,不会等待执行结束。
这是幂等的,不可逆的。
    在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.
在此方法之后没方法可以再被调用。
'''
loop.close()
原创粉丝点击