使用以下技术实现异步的方法在概念上有什么不同?我的主要搜索是Django,但我正在寻找一个概念性的答案,它描述了技术背后的思想。
- 插座。IO和gevent
- WebSockets RabbitMQ
- ,芹菜
我在网上找到了关于这些方法的教程,但是他们没有解释背后的概念,只是技术实现。
异步编程可能很难让您理解。其基本思想是一种绕过阻塞IO的方法。阻塞IO是任何事情,从写入文件,查询数据库,查询REST API,任何会在等待其他事情发生时中断应用程序处理流的事情。
比如说你在构建一个Gallery应用程序,用户可以上传大的高清分辨率图像来炫耀。但你需要对用户上传的大图、缩略图、小分辨率版本等进行各种拷贝,这样做需要一点阻塞IO。您需要压缩映像,这是相当密集的,一旦压缩,您需要将它们写入磁盘,之后您可能需要将所有这些信息存储在DB中。在单个请求中执行此操作将导致用户的性能非常缓慢,而且老实说,后端进程可能会在完成所需的所有任务之前超时。它也不能很好地扩展。
解决这个问题的一种方法是使用异步编程。一旦用户上传完成,您可以向其他应用程序发送各种信号,这些应用程序正在等待压缩图像或将数据写入DB的机会。一旦这个信号被触发,那些后台进程开始工作,你的用户就不必坐着等待一个很长的请求来完成,相反,他们可以继续浏览网站,喝杯咖啡,当他们的缩略图已经完成时得到通知等等。在上面的例子中,我将使用芹菜,RabbitMQ和SocketIO(或者可能是TornadIO)实现这一点。一旦用户上传完成,我会启动一个芹菜任务,芹菜使用RabbitMQ(我更喜欢Redis)来管理任务,你可以有10个,20个,30个芹菜工人在后台处理这些图片上传。一旦芹菜完成了它的工作,它会向Socket服务器发送一条消息,用于处理用户浏览器连接的web Socket。这将实时向用户发送通知,告知他们上传的新图像现在已经准备好与世界分享
这是围绕异步事件驱动编程的真正基本示例。至少我是这么理解的。还有谁请指正我。
我希望这对你有帮助。:)