-
异步 vs. 同步:
-
异步(Asynchronous): 在异步编程中,一个操作被触发后,程序不会等待它完成,而是继续执行后续的操作。异步操作通常使用回调函数、Promise、async/await等机制来处理操作完成后的结果。这允许程序同时执行多个任务,而不必等待每个任务完成。
-
同步(Synchronous): 在同步编程中,操作被触发后,程序会等待它完成,然后才会继续执行后续的操作。同步操作是按顺序执行的,每个操作都要等待上一个操作完成才能开始。
-
-
阻塞 vs. 非阻塞:
-
阻塞(Blocking): 阻塞调用是指当程序执行一个操作时,它会一直等待,直到操作完成为止。在此期间,程序不能执行其他任务,它被“阻塞”了。
-
非阻塞(Non-blocking): 非阻塞调用是指当程序执行一个操作时,它不会等待操作完成,而是立即返回,允许程序继续执行其他任务。程序可以定期检查操作是否完成,或者通过回调函数等方式获取操作的结果。
-
下面是一个示例来说明这些概念之间的区别:
示例:文件读取
假设你要从磁盘读取一个大文件:
-
同步阻塞: 在同步阻塞模式下,程序发起读取操作后会一直等待,直到整个文件读取完成,然后才能执行后续操作。这期间程序被阻塞。
-
同步非阻塞: 在同步非阻塞模式下,程序发起读取操作后会立即返回,允许执行其他任务。然后,程序定期检查文件读取是否完成,但仍然是同步方式。这不会减少阻塞,只是在等待时可以执行其他任务。
-
异步阻塞: 在异步阻塞模式下,程序发起异步读取操作后,它会继续执行后续操作,不会等待文件读取完成。但当需要文件内容时,程序会等待读取操作完成,这时会出现阻塞。
-
异步非阻塞: 在异步非阻塞模式下,程序发起异步读取操作后会立即返回,允许执行其他任务。当文件读取完成后,程序会通过回调函数或其他机制得到通知,这时不会阻塞。
更通俗的理解
假设你有个保姆,你告诉她你想喝一杯开水:
-
同步阻塞: 在同步阻塞模式下,你就一直站在旁边等,水烧开后,保姆把水倒进杯子递给你。
-
同步非阻塞: 在同步非阻塞模式下,你告诉保姆后,就去打电动游戏去了,过一会儿你就跑过来看看杯子里有没有水,没水又跑去玩了,有水就喝水。
-
异步阻塞: 在异步阻塞模式下,你告诉保姆后,你就去打电动游戏去了,过一会儿保姆喊你,水开了,但是要喝水你得自己倒水到杯子里喝。
-
异步非阻塞: 在异步非阻塞模式下,你告诉保姆后,你就去玩电动游戏去了,水开了,保姆把水倒进杯子,然后喊你,你就跑过来喝水。
如理解有误,欢迎指正!