python 同步异步回调函数讲解

先来一个比较low的回调函数示例,这里简单说下,回调其实就是一个对象,这个对象能够实例化那么我们就说可以回调,也就是简单的(*args,*kwargs)调用了

def click(func,*args,**kwargs):
    func()
    print 'callback over'

def callback():
    time.sleep(1)
    print 'i am callback'

click(callback)

运行结果如下:

 

i am callback
callback over

OK,这就如同一个button触发一个event似的,不过问题在于,这是同步的啊,我居然硬生生等了1S。。。这有啥意义呢,纯粹就是为了少写几个button,把所有的event当参数传递进去,一个最low的封装而已。好吧,我们现在考虑考虑如何异步执行吧

直接上代码吧:

import time
import threading

def click(func,*args,**kwargs):
    func
    print 'callback over'

def callback():
    time.sleep(3)
    print 'i am callback'
    

def anc(func):
    t = threading.Thread(target=func,args=())
    t.start()
    t.join()

click(anc(callback))

结果如下:

i am callback
callback over

结果我们依然等了3S,你以为重新开一个线程,我就不会等你了吗?

我们继续改进下呢

import time
import threading

def click(func,*args,**kwargs):
    func
    print 'callback over'

def callback():
    time.sleep(3)
    print 'i am callback'
    

def anc(func):
    t = threading.Thread(target=func,args=())
    t.start()
   # t.join() 这玩意好像引起阻塞了,我们去掉吧

click(anc(callback))

结果如下:

callback over
>>> i am callback

OK,这下没问题了,我们让我们的主线程开心的跑它的,子线程还在忙就忙它的呗,反正到时候,正常情况我们是去调别人的一个api,把我们的结果返回给它。。。很好。这下完美了。

下面问题来了,这样看上去是不是让你们觉得有点不高大上,每次调用都显得非常的麻烦,没问题,我们继续优化,是时候让我们的装饰器登场了。

import threading
import time


def callback(func):
    def wrapper(*args, **kwargs):
        t = threading.Thread(target=func, args=args,kwargs=kwargs)
        t.start()

    return wrapper


def click(func, *args, **kwargs):
    func(*args, **kwargs)
    print("callback maybe not end,but i need tell him that i've received his command")


@callback
def event(*args, **kwargs):
    time.sleep(*args, **kwargs)
    print('i am a event what you need now!')


@callback
def another_event(*args, **kwargs):
    time.sleep(*args, **kwargs)
    print('i am another event you need now!')


click(event,3)
click(another_event,6)

执行结果如下:

callback maybe not end,but i need tell him that i've received his command
callback maybe not end,but i need tell him that i've received his command
1213
>>> i am another event you need now!
i am a event what you need now!

>>> 

OK,现在是不是就完美多了,更加的pythonic了!

现在新的问题来了,如果是在一个类里面呢?

同学们,你们需要思考一下了:

1 不同的线程,我们的私有变量应该如何去处理;

2 如果返回的是实时数据,我们应该如何避免管道阻塞的问题。

这一节我就不做深入讨论了,下一章讲解WSGI的api开发的时候我们再来讲解吧

Vivado2023是一款集成开发环境软件,用于设计和验证FPGA(现场可编程门阵列)和可编程逻辑器件。对于使用Vivado2023的用户来说,license是必不可少的。 Vivado2023的license是一种许可证,用于授权用户合法使用该软件。许可证分为多种类型,包括评估许可证、开发许可证和节点许可证等。每种许可证都有不同的使用条件和功能。 评估许可证是免费提供的,让用户可以在一段时间内试用Vivado2023的全部功能。用户可以使用这个许可证来了解软件的性能和特点,对于初学者和小规模项目来说是一个很好的选择。但是,使用评估许可证的用户在使用期限过后需要购买正式的许可证才能继续使用软件。 开发许可证是付费的,可以永久使用Vivado2023的全部功能。这种许可证适用于需要长期使用Vivado2023进行开发的用户,通常是专业的FPGA设计师或工程师。购买开发许可证可以享受Vivado2023的技术支持和更新服务,确保软件始终保持最新的版本和功能。 节点许可证是用于多设备或分布式设计的许可证,可以在多个计算机上安装Vivado2023,并共享使用。节点许可证适用于大规模项目或需要多个处理节点进行设计的用户,可以提高工作效率和资源利用率。 总之,Vivado2023 license是用户在使用Vivado2023时必须考虑的问题。用户可以根据自己的需求选择合适的许可证类型,以便获取最佳的软件使用体验。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值