同步与异步

2018-09-05  本文已影响0人  MononokeHime

同步与异步

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

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

阻塞与非阻塞

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

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

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

总结

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

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

自定义异步操作

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

什么是 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()
上一篇下一篇

猜你喜欢

热点阅读