阻塞和同步的区别

128 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

同步和阻塞

今天在总结一个问题的时候,发现了一个有意思的问题,之前没有深究过,那就是阻塞和同步的区别。
首先,我当时遇到的问题是无缓冲的channel是否是同步还是异步?

  • 无缓冲的channel是同步的,当你向channel发送数据时会被阻塞,只有当另外一个协程读取channel,才会解除阻塞

  • 那么,阻塞和同步的区别是什么?

    • 同步和异步 :
      • 同步:如果你去执行某个操作,但是这个操作需要等待一段时间才能执行,你也必须继续执行下去。就比如,你去考试,提前10分钟进考场。进了考场你就要等待考试开始,中间不能去打篮球。
      • 异步就是调用一旦开始,不必等待结果,中间可以去干其他事情。比如你去吃饭,但是这次是点的外卖,点外卖之后可以去下楼买东西,可以刷剧、聊天
    • 阻塞和非阻塞
      • 阻塞也是在调用时,因为某种原因(IO请求、申请缓冲区失败)会发生阻塞,受阻进程会处于暂停状态,会释放CPU的,等待被唤醒。比如:你在做一道很难的题,想不出来,抓耳挠腮这时候你室友找你去喝酒,你说学习学个屁,不把注意力放在这个难题上了,然后去喝酒了。
  • 区别:同步关注的是通信方面的问题,关注是否等待得到结果。而阻塞时系统方面来说的,阻塞时系统会放弃cpu、放弃所占用的资源,然后去转而执行其他线程。同步和阻塞并不冲突

  • channel阻塞的过程:

    • channel满了,阻塞写。channel空了,阻塞读。无缓冲时,只有同时读和写,才不会阻塞
    • 当发生阻塞的时候,协程会交出CPU,让给其他协程,期待它能帮助自己解决协程(通过管道)
    • 如果是在main中发生了阻塞,而又没有其他的协程,那么就会报fatal error
    • 如果是非main协程中发生阻塞,就会一直阻塞,然后等待解决