• 多线程和蕃茄炒蛋


    今天刚毕业的新人问我关于多线程的问题,因为我也没有理解透彻,一时没有解释清楚,现在细想类比蕃茄炒蛋,整理了下:

    IIS是一个天生的多线程程序。
    好比,一个订单请求过来,就放出一个厨师做蕃茄炒蛋,再来一个新订单,再放一个厨师出来做蕃茄炒蛋。厨师做完菜,就回房休息。
    因为是多个CPU,多核,可以安排N个厨师同时干活。每个厨师参照同一份菜谱(程序代码)做菜,各自记下自己的步骤。
    如果还是嫌上菜速度太慢,那就要修改菜谱,原来的菜谱是对针对一口锅写的,现在我们拿来两口锅。
    原来的菜单类似于这样:
    第一步:准备好一只蛋,和一只蕃茄。
    第二步:把蛋放在锅里烧1分钟+,起锅拿出蛋。
    第三步,把蕃茄放在锅里烧1分钟+,混入炒蛋。
    第四步,翻炒1分钟后起锅。

    改进后的新菜单类似于这样:
    第一步:准备好一只蛋,和一只蕃茄。
    第二步:同时点火两口锅,分别放入蛋和蕃茄,各烧1分钟+。
    第三步,看蛋先熟还是蕃茄先熟,先熟的食材的锅先安排熄火。
    第四步,待慢热的另一个食材也烧熟后,将两种食材混和翻炒,然后起锅。

    现在每个厨师拿到新的菜谱后开工,工作效率明显提升了,每份蕃茄炒蛋大约省下1分钟的时间。

    值得注意的是,厨师们还是只参考同一份菜谱,并没有各自复印,但他们各自干活时会记下各自的工作进度(指令指针和私有变量)。
    两口锅工作时,锅里的食材不一样,进度不一样,但是还是参考同一份菜谱,各自关注锅内食材的成熟度(指令指针和私有变量)。
    厨房的排风扇,水龙头,电灯,燃气,是所有人共享的。
    电灯大家都用,下班后最后走的那个人关灯,不会冲突,没有问题。
    燃气分别为每口锅各自提供接入,各自开关,不会冲突,没有问题。
    水龙头每个人都要用到,而且一个水龙头大家共用,只能一个人接水,这就很容易发生水资源抢占的问题。
    最糟糕的情况时,我正准备接水的时候,别人高处截流,导致我一直接不到水,结果鸡蛋炒糊了,油锅都起火了,这就很不安全了。
    所以多线程程序会额外引入资源分配,线程同步的问题。
    通常的做法是,协调好厨师们用水的方式,比如约定排队取水,先到先得,用完即走。

  • 相关阅读:
    linux 进程操作脚本
    go 项目监听重启
    go 小题
    beego 基础
    beego 接口开发
    beego 安装
    mongo curd
    html的学习(一)
    ssl
    java编码的学习
  • 原文地址:https://www.cnblogs.com/heguo/p/11252845.html
Copyright © 2020-2023  润新知