简短回答:1) - 否(但如果 db 协议本身需要在接受下一个命令之前完成上一个命令,则可能是肯定的,Mysql 就是这种情况);2) - 不,从用户的角度来看,它们是并行运行的
长答案:
想象一下,您的工作是接听客户的电话,并根据问题将其发送给相应的客户支持(您有 10 个第三方服务,每个服务都有客户支持热线)。所有线路都很忙,需要几分钟才能接听。答案本身通常很短。
场景一(20个线程,线程池):
您有 10 条电话线用于来电。您有 10 条用于拨出电话的电话线。您接听来电,听问题并拨打电话。“请等待答复”给客户。与此同时,您手中还有 20 条线路,在切换到下一条线路之前,您要求客户或支持人员等待。
场景二(无线程池)
与方案 1 相同,但最初您有一条传出线路。如果您有来电并且您的去线忙,您要求所有客户等待,然后您去电话公司安排新线路(创建新线程)。
场景 3(异步 io、回调)
一行(= 执行线程)。您接听电话,写下问题和来电显示,并以“谢谢您的问题,我会在几分钟内给您回电”回复结束通话。您称您为“异步”客户支持,但不要在队列中等待,而只是告诉短消息:“我的 id 是 xxx,问题是 yyy”并结束通话。
每次您从客户支持收到回复(回电)时,您都将其写下来,然后在客户问题列表中查找客户 ID,致电客户,告诉他回答并丢弃关联客户 ID <-> 问题 <-> 回答的记录. 每次您收听客户的问题或致电支持以发送问题或接收答案或致电客户回答时 - 其他客户在队列中等待。(您正在阻塞事件循环),因此对您而言,尽可能少地使用线路很重要,而支持应答时间则不太重要。