同步与异步
同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步
: 当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。 异步
:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。 异步调用,要想获得结果,一般有两种方式:
- 主动轮询异步调用的结果;
- 被调用方通过callback来通知调用方调用结果。
阻塞与非阻塞
阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。
阻塞调用
在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活.
非阻塞
调用在发出去后,不会阻塞当前进/线程,而会立即返回。
总结
通过上面的分析,我们可以得知:
- 同步与异步,重点在于消息通知的方式;
- 阻塞与非阻塞,重点在于等消息时候的行为。
自定义异步操作
对于耗时的操作,会交给别人(另一个线程)去处理,我们继续向下执行,当耗时操作完成后再将结果返回给我们。异步的实现方式:
- 回调函数实现异步
- 将耗时任务丢给第三方处理(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()
网友评论