美文网首页
同步与异步

同步与异步

作者: MononokeHime | 来源:发表于2018-09-05 13:54 被阅读0次

    同步与异步

    同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步: 当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。 异步调用,要想获得结果,一般有两种方式:

    1. 主动轮询异步调用的结果;
    1. 被调用方通过callback来通知调用方调用结果。

    阻塞与非阻塞

    阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。

    阻塞调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活.

    非阻塞调用在发出去后,不会阻塞当前进/线程,而会立即返回。

    总结

    通过上面的分析,我们可以得知:

    1. 同步与异步,重点在于消息通知的方式;
    1. 阻塞与非阻塞,重点在于等消息时候的行为。

    自定义异步操作

    对于耗时的操作,会交给别人(另一个线程)去处理,我们继续向下执行,当耗时操作完成后再将结果返回给我们。异步的实现方式:

    • 回调函数实现异步
    • 将耗时任务丢给第三方处理(celery)
    • 协程实现异步

    什么是 callback 函数

    回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。

    image.png

    在IO下模拟利用回调函数处理异步任务

    import time
    import threading
    
    def longIO(callback=None):
        def run(cb):
            print("开始耗时操作")
            time.sleep(5)
            print("结束耗时操作")
            cb("从数据库查出结果为100")
        threading.Thread(target=run,args=(callback,)).start()
    
    # 回调函数
    def finish(data):
        print('开始处理回调函数')
        print('接收到longIO的响应数据:',data)
        print('结束处理回调函数')
    
    def reqA():
        print("开始处理A请求")
        longIO(callback=finish)
        print("结束处理A请求")
    
    def reqB():
        print("开始处理B请求")
        print("结束处理B请求")
    
    if __name__ == '__main__':
        reqA()
        reqB()
    

    相关文章

      网友评论

          本文标题:同步与异步

          本文链接:https://www.haomeiwen.com/subject/ourmwftx.html