关于同步、异步与阻塞、非阻塞问题的研究

    xiaoxiao2022-07-03  99

    讨论同步异步以及阻塞非阻塞问题

    1.同步:代码按正常顺序一行一行,一个任务一个任务地去执行。如果在执行一段调用命令时,在没有得到结果之前,该调用就不返回。换句话说,就是由调用者主动等待这个调用的结果直到完成才会继续进行。 2.异步:遇到异步代码,它会跳过异步代码,先把同步代码执行完,接着,到了合适的时机,才会去执行异步代码。换句话说,当一个异步过程调用发出后,调用者下面的任务不会被影响。同时在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。 3.阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。 4.非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 5.同步和异步指的是被调用者,阻塞和非阻塞指的是调用者。同步和异步关注的是消息通信机制,而阻塞和非阻塞强调的是调用者当前状态。 清楚了这写概念,接下来再拿一个例子做一个演示:

    故事:老王烧开水 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没。 -同步阻塞 (PS:这种方法不够聪明呐。) 2.老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去寝室上网,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人。 -同步非阻塞 (PS:现在的方法聪明了些,但是还是不够好。) 3.老王这次使用高大上的响水壶来煮水,站在那里,但是不会再每隔一段时间去看水开,而是等水开了,水壶会自动的通知他。 -异步阻塞 (PS:既然水壶可以通知我,那我为什么还要傻傻的站在那里等呢。) 4.老王还是使用响水壶煮水,跑到客厅上网去,等着响水壶自己把水煮熟了以后通知他。 -异步非阻塞 (PS:这下感觉轻松了很多。)

    在这个例子中,烧水的过程就相当于同步异步代码,即是被调用者的处理方式,它们相对于操作结果来说,会不会等待结果返回。而阻塞非阻塞就相当于老王在烧水的过程中的状态,阻塞就是说在烧水的过程中,老王不可以去干其他的事情,非阻塞就是在同样的情况下,可以同时去干其他的事情。阻塞和非阻塞是相对于主线程是否被阻塞。

    在上文中,我们也提到了关于进程和线程的问题,这里,就做一个简述: 1.进程:一个项目就是一个进程。你只要把代码跑起来,那么这个代码就是可以当作一个项目,这个项目就是一个进程 。比如在任务管理器中,应用和后台进程都是如此。 进程是操作系统分配和调度资源(内存和CPU)的基本单位 。 2.线程:在一个进程中,包含若干个线程,真正干活的是线程。 如工厂—>进程 工人—>线程 进程大,线程小

    最新回复(0)