粉丝224获赞1552

哈喽,大家好,今天给大家介绍一下剑术德段化的多线程任务,这个多线程任务可以同时执行 n 个脚本 啊,可以同时执行,我们可以进行挂一些后台任务,或者是挂一些呃同步的一些找图任务,可以同步的进行运行这个任务,那么我们呃做一个视力,我们新增一个脚本, 这里创建了五个脚本,五个操作于模拟器啊,五个后台任务,我们点击选择第一个, 那么首先看左上角,他标注的是一个后台任务,那么就是后台点击任务 id 一就是脚本名称,独立的启停,还有定时任务,总英雄次数状态,包括这一个逻辑任务,那么这个逻辑任务的话,只用于 当前这个脚板的一个结束状态。例如说如果找图任务,那么遇到了找图失败,结束任务了,那么他的状态就是一个呃异常结束,那么异常结束之后,我们可以做一些呃任务提示,或者是开启一些其他的线程, 成功之后也可以进行一些一些操作,那么我们来运运行一下,选择运用选中的这个好,他点击了两个操作,我们这边直接建立了两条任务啊,只有两条任务, 那么我们讲一下左边这片功能,删除,全部删除,这一个是呃运行选证,然后全部运行,然后详细查看那个脚本任务啊,这两条任务啊,这个是任务导出,我们可以把 n 个东 线城的任务导出一个总的一个任务,那么我们导入的时候,也会把所有的呃子线城任务啊,这个多线城任务进行导入进去汇总成一个呃一个脚本,非常的方便, 那么我们可以设置一个独立的启停,我们设置一个按键,嗯, ctrl 一好,我们按下 ctrl 一启停。 好,绿色的就是正常结束,红色就是异常结束。我们这边可以建立多个模拟式任务,我们把这四个增加进去,一五四、三、二,然后我们全部运行, 我们可以看到五个模拟器同时就都进行了这一个点击啊,这就是一个同步执行, 那么我们可以把这一个运行次数视为无限次,无限循环。以下就是无限循环啊,然后我们全部运行,全部运行 好,那么他就进入一个无限循环的一个状态啊。右侧是一个呃任务输出栏,可以看这个任务输出,比如看子线从一,他正在执行啊,我也在执行 二,往这划三四,每一个线程都有独立的一个任务输出,方便查找问题,方便这个查看,查看当前的一个运行状态啊,非常的完美。然后我们呃全部再点一下屏幕运行啊,全部停, 停止。好,可以,我们也可以通过这一个独立启停来进行这个操作, 然后这一个是定时任务,在多线程任务中,我们可以进行一个定时任务,我们点开点开定时任务,它里面有这个计划器、定时器和倒计时器, 我们举例一个倒倒计时器,嗯,二十五秒吧,开始计时 好,他就会执行这个脚本无限循环,那么无限循环的话,我们去按,按下 ctrl 一停止停止,这就是一个定时任务。嗯,逻辑操作我们就不讲了,不讲, 呃,主要讲一下他这个这一步操作吧。那么我们正常结束栏,我们选择这一个开启子线程啊,我们选择一个 拖一下,我们选择一个任务 id 二吧,我们把这个次数都成一次一次,然后我们正常结束栏,我们开启指定子线程,任务 id 二,这个是任务 id 二,我们我们然后按下这个 ctrl 一 好,它结束之后就就会运行这一个任务 id 二,那么任务 id 二的话就是这一个模拟器五啊,他刚刚也动了,我们再来一遍, 好,运用完它再运用它。好,这样的话可以进行一个循环调用,可以按顺序调用这一个脚本,我们调用完它之后,可以调用完第二个,再调用第三个,第四个,第五个 自雷推,然后我们进行这一个任务导出啊, 模拟器总脚本,好,保存一下,然后我们点击这个全部删除,重新导入一下。 好,那么这所有的脚本就会那个插入进来,那么还会保持当前的一个状态,包括一些所有的逻辑,包括独立启停都可以保存起来。 那么我们再再来再来讲一下这个多线重任务的脚本,当我们比如当前这个脚本是模拟器五啊,我们点这个模拟器五查看这个状态是两个,两个任务,然后我们再插入一条, 再插入一条,然后点击保存,我们再来查看一下, 好,他会变成三条数据,会实时同步这一个脚本脚本任务脚本文件,那么当脚本文件发生变化之后,这边的脚本会实时进行一个更新啊,会实时进行更新。好,这就是一个多线程任务的使用方式。

各位同学大家好,我是公控关老师。呃,这个有一段时间呢,老师一直在忙手里的这个麦斯项目,然后最近呢,在 b 站传视频传的就比较少,但是最近呢,依然来了非常多的同学啊,就是搞我们公控这个行业的同学,现在还是需求蛮大的, 看到同学们每天进步的很快啊。然后呢,最近呢,有很多同学在做一些项目的时候,呃,经常问老师一个问题,就是我,我感觉很多同学可能也都会遇到哈。 呃,就是说我们用到多线程的时候,就是一个程序里面有可能就说用到了很多个线程,那么不同的线程做不同的任务,对吧?但是呢,他又想控制这些线程的一个顺序,对吧?假设说我们读 p l c 数据啊,这个在一个县城里面,他先执行,然后呢,我们画曲线,对吧?这个在另外一个县城执行。呃,然后呢,保持把数据储存到数据库里面,在第三个县城里,那么他要按照一二三这个顺序,按顺序的这样来执行。那么怎么样灵活的 啊,很优雅的来控制我们多线程的这个顺序呢?啊,这也是非常重要,所以,呃,老师这节课呢,给同学们来讲一讲。 那么在之前的课程里呢?呃,我们先看一下,之前老师给同学讲过一个,就是关于我们这个多线程的这个创建,然后暂停,对吧?包括这个继续,对吧?来取消, 我们当时呢是通过我们这个,当时呢,我们是通过 这个 manual reset you want, 对吧?那么同学们应该还记得我们用的是这个类,对吧? manual reset you want, 那么它是一个手动复位的这么一个事件,对吧?手动复位的这么一个事件,那么 他呢?我们再来回顾一下啊,就是当我们暂停县城的时候呢,他会给我们这个 manual reset 与万的这个对象呢?给他一个 reset, 对吧?那么 recept 以后呢?就会在我们这个多线程当中 video one 这个位置呢?给他收到一个主摄的信号,主摄当前的线程,那么当我们 重新点继续的时候,对吧?他会 set, set 干什么呢?就是让我们这个维特万这个地方收到信号,收到信号以后呢,这个地方像一个闸门一样,同学们把它理解成是一个水闸 砸门,一旦 set 给他信号了以后,绿灯了,那么这地方就一直保持畅通了,对吧?后面他就会一直直行,只要只要收到信号,他就会一直直行,这叫 manual recite one, 对吧?那么 我们回过头来,对吧?来创建我们今天的这个,那么假设说,我们现在,对吧?有这么三个县城,对吧?同学们,老师,为什么给同学们大家讲 task, 对吧?那有的同学说了,对吧?老师,那个我会啊, 对吧?假设我在这里面写几个方法, 这个 a 方法,对吧? control 点 right line a 那么有的同学说,老师,我会啊,我用这个 t 一,对吧? t 一点 drone, 对吧?我现在假设说有两个县城, 这个当然也是一种方法,一个 a, 一个 b, 对吧?一个 a, 一个 b, 然后呢? 一个 a, 一个 b, 然后呢?我现在什么呢?我现在想让这个二执行完了,执行一,对吧? t 一点 star, 对吧?二执行完了执行一,对吧?那么我正常这样写的话呢,它肯定是呃 a b 交叉执行的,对吧? a b 交叉执行,假设说我这里面, 嗯,我写一下这个十四, 那我们同学先看一下效果, a b, 对吧? a b 它是直行的,是 a b, 那么假设说我想让呃这个, 我假如说我想让这个 b 执行完了,执行 a, 那怎么办呢?我是不是在这里我可以这样写, 对吧? 我可以在 a 线程里面,在 a 线程里面,我可以等待线程二执行完毕,对吧?我再执行 a, 那这时候我们一起看一下,对吧?这样的话呢,先执行个 b, 再执行 a, 这也是一种控制控制线程顺序的一种方式,对吧?控制线程的一种方式,那么, 嗯,有几个问题,有几个问题,我们同学看一下,就是说,那如果说我们要用这个 spread 点 join 这种方法,对吧?我们是先输出了 b, 再输出 a, 那我如果想 a b 交错,怎么执行呢?对吧?那你怎么办呢?那有同学说,那我把它写在这儿, 对吧?你写在这也没用,你写在这的话,我们可以看一下,你这也是把 b 全打印出来了以后,然后再执行,我们看下效果, 对吧?也是 b 打印出来以后再次行 a, 所以满足不了我们 a b a b 这样的一个需求,对吧?我们正常的话呢?同学们知道,我们在 呃做项目的时候,假如说我们在一个县城里面,对吧?他都是一个循环,循环里面,这里面,对吧?在执行我们的代码执行,我们读漂这数据啊,画曲线呢,储存数据库啊,他都是在一个循环当中,如果你用这个 swriter, 我们用这个 t 一点 join, 对吧? t 二点 join 这个方法,你等待这个线程执行完毕,对吧?那么你假设说这个也是一个循环, 对吧?这个 b b 线上也是个循环,那你在这里 你等待 john, 对吧?你等待线头完成,那线头根本完成不了,他一直在循环,对吧?所以你这个没法灵活的控制,对吧?这是第一点。另外一点,我们这个 srid 跟同学们讲过,我们这个 srid 跟我们这个 task 比,对吧?我们 task 的 他,他执行的效率会更高,尤其在于我们这个多核 cpu 的时候,他执行的效率更高,对吧?而且他的这个用的是这个本地的现成池,对吧?所以说呢,我们 更推荐在后台,呃,长期执行那些任务呢?用这个 task 来实现,那么 用 task 怎么样来灵活的实现我们对这个线程的控制呢?我们把这个之前的注视掉,呃,把之前的这个注视掉, 那么假设说呢,我现在还是同样,对吧?这个输出 a, 然后呢?这个呢?输出 b, 那么同学们可以我们想到 之前老师讲过这个 minor reset you want, 对吧? minor reset you want a, 等于 new 一个 minor reset you want, 然后呢,我们再来个 b, 来个 b, 那么我们在这里是不是可以写这个 a 点 weight one, 对吧? 然后在这里呢,也写这个 b 点 weight one, 然后我们同学知道什么呢? be 点 set, 对吧?是给我们这个 middle reset 一万种搜到信号 set, 假如我们再写一个吧,再写个 c 吧,答案是 c is c, 然后呢,这个是 c 点为换, 我们在上面再实力画一个, 然后在这里我们起三个县城 task their wrong e a, 那么这三个线程呢?我们正常如果说现在, 呃,我们先把这个注视掉啊,先不加这个 wait 半防晒,我们先看一下效果, 那很显然,这些三个线程 a, b, c 呢,肯定是随机运行的,对吧? c b, a, 同学们可以看一下,现在 c b, a, 我们再运行一下, 那 b, c, a 对吧?我们再点一下 a, c, b, 对吧?再点一下 a, b, c, 这位同学们看一下,由于时间篇我们 c p u 自动会给这个现成呢,会自动分配我们这个运行的这个指令,那么它有可能是是随机的, 那么我们想让按照我们的需求,先执行 a, 再执行 b, 再执行 c, 然后循环往复这么运行,对吧?那么呢,我们就把这个 a 点 vat one 给它加上,对吧? 注意一下,这个 c 呢,我们要小写,对吧,表示是我们这个 middle reset one 这个对象。那么首先一上来呢,我们一上来的时候,同学注意看一下,因为我这个 manual reset you want 呀,它现在是 force, 对吧?磁力化的时候呢,我们这个构造函数全参是 force force 表示什么呢?就是我当前这个主设的这个事件呢, 他没有终止,对吧?没有终止表示什么意思呢?就是一上来他就是主射的,所以我们一上来呢,必须得给他一个触发,让这个 a 点赛,对吧?首先先让我这边先启动起来,然后呢他启动起来了以后,我们原本的初衷是什么呢?让 a a 启动起来了以后,他收到信号,然后他启动起来了,打印输出 a, 然后呢 再给到 b 信号,对吧? b 在这里面,首先一开始它是主射柱的,对吧?我这三个线程虽然是同时启动,但是 b 一上来它是主射柱的,对吧? 因为我这边它是 force 嘛,就是我这个它是没有中指嘛,所以 b 和 c 都应该是主摄状态。我一旦 a 给 set 了以后,对吧?然后 a 完事了以后,打印完了 a 以后,然后 b 给到他信号,然后他再输出 b, 然后 他再给到 c, 对吧? b 完事以后给到 c, 然后 c 完事以后呢?再给 a 收到信号。我原本的意思是这样,但我们看一下效果行不行,同学们可以看一下,现在输出的呢?还是输 处的 a c c b b b 没有达到我们预期这个效果,对吧?我们再运行一下,对吧?可以看一下还是不行,对吧? a b c, 我们再运行一下 a c, b, 对吧?没有实现我们效果,那同学们说为什么呢?因为老师之前给同学们讲过,我这个 a 点 v 的话,一旦搜到 site 信号了以后,对吧?他首先他会给他搜到信号,会让这个闸门打开,会让他变为绿灯,打开输出 a, 然后呢? 把 b 放行,把 b 放行,然后这个时候 b 这边输出 b 了,它是输出 b 了,但是 a 这边,对吧?一旦它变为绿灯了以后,它并不会自动复位,对吧?并不会自动的, 又又主射住啊,又变成红灯,他不会变成红灯,对吧?他必须手动变成红灯。所以说呢, 这个地方它会连续接着输出 a, 不一定非得等到你这边。下一次 a 收到这个信号以后,那么怎么办呢?我们在这里,所以老师刚才给同学们讲清楚,这个东西我们就不能用这个 minor reset 语文,就得用这个 otor reset 语文,对吧?只需要把这个都改成 otor reset 语文,那么当我们这个 a 点 v to y 了以后,对吧? 他收到这个 set 信号了以后,一上来给这个 set 信号以后,他打开输出 a, 对吧?他搜完信号了以后,一旦执行到这了以后,对吧?这个 a 这个对象呢?他会自动就给你主摄入,他不会 再处罚下一次循环又输出 a, 对吧?我们这时候看一下效果,同学们看现在是不是好像达到我们预期了?我们为了看的明显一点,我们在这里呢,我们再给他答案,输出一个比较明显的一个符号,输入一串等号吧。 这个时候我们看一下,同学们也可以看一下,现在每次呢,他执行的这个现场的顺序呢,就是按照我 a, b, c, a, b, c, a, b, c, a, b, c, 对吧?这样一直行,那么达到了我们预期的一个效果,对吧?那么假设说呢?我们这边呢,如果说不是这样的,假如说是个 where, 就一直在循环,对吧?一直在循环,不一定非得循环十次,对吧?我们在实际做项目时候,有可能这个任务一直在 循环,除非你取消现成了,要把这个任务退出了,那么他才结束,那么这个时候呢,我们可以看一下, 对吧?它是不是,对吧?没有问题,对吧?一直在执行,那么 a 呢?就代表我们可能是读 p、 l、 c 的数据,对吧? 给图片写上吧,读 p、 l 这数据,然后这个呢? b 呢?有可能是实时曲线,对吧?实时曲线,然后这个 c 呢?可能是保存到数据库,对吧?他们各执行各自的任务, 对吧?然后他们时间间隔呢,有可能是不一样的,对吧?他们的延时的时间呢,你可以加上不同的这个延时的时间,但总之呢,他们执行的顺序一定是 a, b, c, a, b, c, a, b, c 这么一样一个顺序,所以同学们 们呢,通过 auto reset you want 和 menu reset you want。 呃,老师刚开头给同学们讲我们之前这个例子, 然后刚才给同学们演示了一下我们要 manual set 的一半,为什么?就是说他每次这个收到信号了以后啊,他会不会自动的复位,对吧?这就是他俩最大的一个区别, 所以我们要希望他自动复位的话,就用到这个 otory sety one, 然后通过这个呢,我们可以在线程当中的灵活的控制我们线程的顺序,那么就是就是这样来用,好吧,那么同学们下去以后呢,去练习一下非常重要。 然后呢,因为很多同学问,老师就给同学们单独讲一讲,就像之前我们讲那个 thread 点 join 的那种方式呢?它相比来 讲呢,嗯,我更推荐用这种 oto reset 与 vat, 因为它就是控制,它的目的就是呃,控制我们的线程这个同步啊,控制我们线程这个顺序来产生的这样的一个类,对吧?你这个 thread 呢? 他那种没有这种方式更加灵活,对吧?同时我们这个 task 可能在运行起来的效率更高, 对吧?占用内存更少,所以同学们呢,有任何问题呢,可以加郭老师微信进我们学员群,然后现在学员呢已经八百多人了,然后越来越多的同学,然后,嗯,希望同学们呢把这个 csap 供供控技术能掌握的越来越好,然后灵活的运用在自己的这个工作当中。那谢谢同学们,那这节课讲到这里。

大家好,我是一标科技,我们今天开始讲解这一款 dk c 杠 y 三六零系列的这个,呃,触摸屏一体机。呃,今天我们讲解的是第二课编辑框的应用 编辑框就是说他是可以用来显示数字或者是输入数据,都是可以的,显示数据和输入数据,这个编辑框他相当于一个是双向的, 然后我们点击这个编辑框以后,可以看到右边这个属性栏,属性栏前面的是一些坐标、长方靠以及字体颜色 显示隐藏,这些我们啊都已经有,前面已经有介绍过,所以今天我们就不再重复讲解,然后如果不 清楚的可以看一下前面那个文本框的那个介绍啊,都有那个介绍的,包括将这个显示隐藏啊,我们就今天就不再重复了。然后我们下来下面这个是使能, 这个使能的用法跟前面这个显示隐藏的功能是一样的啊,用法是一样的, 它的功能就是说相当于一个一个。呃,这这个编辑框的一个开关, 比如说用一个 m 计存器,我们就可以控制它开或者关,如果关的时候,嗯,我们就是说是不能输入数据的,开的时候是可以输响应那个输入数据,但是显示他是一直都可以显示的,他只是开关那个能不能外 不输入的这个功能而已。然后下来一个计算器,那同样的就是说是显示这个低计算器里面的数据,或者是说把这个数据你编辑框里面的数据传送到计算器来,是这个意思。 好,我们同样,嗯,今天是在做一个简单的例子,我们只能前面一个,然后同样是加一个开关,用开关来控制它。编辑框,这个是开 这个关控制模式样式,我们同样是选一个扁平式的, 用一个滑块显示他的数据,然后把 这个通过这个第一计程器,第一,据说这个输入的数据,然后通过这个编辑框把它显示出来啊,是通过这个第一, 嗯,这个也是指向这个第一,他们俩都是同样,就是说他们通过第一把这个显示出来,然后这个开关,然后我们再添加一个 这个我们是响应的输入的,然后那我们输入数据,那我们用一个第二 d 二,然后那我们怎么知道它里面显示的数据是不是一样的呢?我们再用这个文本框把它显示出来啊,这个也是我们前面已经讲解过,我们这里 就不再重复。也是第二,就是说这个里面的数据输入以后,把它通过这个显示出来啊,这个第二,第二,好,这样子,我们已经啊大概大概弄好,然后我们做一下简单的区分, 加一个这个 好,再添加一个 好,可以锁定这个,也把它锁定 好,我们大概就两部分,嗯,比较简单的一个画面。好,我们再下载试一下。 好,再看一下,好,这个时候我们已经可以控制了 看 ac 点击,但是因为为什么改不过来呢?是因为我们现在这个数据它是受到这个滑块控制的,当我们修改这个数据以后,它 又会被这个滑块瞬间给修正过来,所以说我们改这个是没有用的,必须他是现在是受这个控制的。 好,这个我们已经演示完,你看这个是他是可以不能输入,但是他可以修改数据, 这个就是这个使能的作用。好,我们修改这个以后,你看这边从立刻就更改过来,我们双击,然后再更改,可以删除为一万 一千,然后按按确定,这个时候他就变了一千,然后这边的同时也是一千,就是说他通过这个双击这个以后调出键盘,然后修改数据,把这个数据传送进去。 好,同样的疑问,我们怎么样通过这个编辑框来控制程序里面的数据?或者是说我们程序的数据怎么通过这个编辑框显示出来?好,接下来我们再通过一个简 简单的例子啊,再来测试。回到电脑页面啊,我们把一些没有用的先删除掉 这个前面这个锁定了,我们这个框改不了,那我们要怎么弄?就是可以双击双击以后才会选中,选中,然后取消锁定,这是一个小技巧啊,我们把它删除掉, 删除这个同样也是双击,然后在右键才能显示,否则你不双击他是你是选中不到这个已经锁定的那个空间,我们双击他,然后 点取消锁定,然后删除这些删除,删除,我们不要。 好,这个是我们添加两个编辑框, 同样添加几个按钮 显示复位,我们也是选择程序复位,这个是暂停, 触发事件也是程序暂停,然后这个是运行 这个云, 然后我们把它调大一些, 字体也调大一点, 然后我们到程序设置, 我们通过先设置一个速度,速度然后再正转,然后程序暂停, 程序暂停,然后跳转。啊,我们加一个反转嘛, 好,嗯, 这个是速度,我们通过一个低计算器第一设置他的速度,然后正转多少圈,我们也用一个低计算器,第二,这个反转也是同样是第二,就是说我们只要前面一个输入参数,输入一个速度和一个正反转的距离。 啊,这里这个是距离,我们是第二,这个是速度,第一选计算器第一。 好,门框 显示 圈数,还有速度, 这个黑色。 好,我们这个,嗯,再加一个 好字体调大, 然后我们在显示显示那个电机当前的位置和速度,我们在参数设置这里绑定一个。嗯,我们刚才已经用了第一跟第二,那我们就绑第三跟第四, 就是说电机的实时位置,我们通过这个第三显示出来电机的实时速度,我们通过这个第四显示出来。嗯,这样子绑定它就可以了。嗯, 绑定完然后我们检查一下程序,然后我们再显示一下那个实时位置。实时位置,嗯,也用编辑框把它 显示出来。 好,我们再看一下这个位置的是第三。好,我们是第三 数值样式,然后显示第三,这个也是数值样式。第四 字体我们调大一点。 好,一个简单的页面就这样子编辑设置好了。啊,我们加一个框,好看一点, 差不多就是这样子,这个是速度,这个是圈数,我们,呃,点击下载, 下载成功,然后程序这边也要点下载。好。哦,忘了,我们再添加一个这个状态, 添加一个状态,要不然不知道程序是否在运行啊。重新下载, 我们运行把瓶盖两圈,然后我们再运行一下,再反转, 好回到零这个时候。好,我们再试一下,我们改到五,速度我们改到一万,按确定这个时候速度同步更新过来,然后,然后我们按运行, 可以看到电机运行停在五圈的位置,然后我们再按运行,再反转回到零位。所以说现在这个程序 运行的位置是完全是由这两个边际框进行控制的啊。我们速度是十圈改成十, 这个我们可以改到 改成两万, 往前往外好按运行键,可以瞬间电机停在十圈的位置,然后再按运行 好就在零位置好,就这样子,今天我们的呃讲解就到这里了。

多县城的特点是什么?用一句话概括,那就是一个县城向另一个县城如何发送数据,也就是数据的发送方 和接受方两者之间如何进行协调的问题。多线城的任何问题最终都归结为这个基本问题。 比如生产者、消费者问题,由于生产者生产产品的速度和消费者消费产品的速度是不一样的,所以在两者之间可以使用缓冲器,这产品就被认为是生产者和消费者之间相互传递的数据。再比如读写问题, 那就是多个毒进程相互之间是不会产生干扰的,但是毒进程和血进程之间以及血进程相互之间是会有干扰的。毒血问题和生产者、消费者问题的区别就在 在于读写问题的读进程,读了数据以后,这个数据还会被放回到缓冲区里面,让别的读进程进行读取。而生产者、消费者问题则不同,消费者 获取这个数据以后,这个数据就会被从缓冲区里面删除掉。所以无论是生产者、消费者问题还是读写问题,他们都是数据发送接收的特殊情况。 总结起来讲,第一,数据的发生和接收要么都成功,要么都失败,也有可能一个成功一个失败,这在单进城里是不可能的。第二,无论是成功还是失败, 数据的发送方和接收方要分别按照两种情况进行考虑,假设数据发送成功,则发送者要么他立刻返回,要么等接收方收到数据之后 再返回,也就是同步返回,就像普通的函数吊用一样,如果发送失败,则发送方要么直接返回,要么等到环中区里有空位的时候放下数据之后再返回。对于接收方来说,如果接收成功,则他直接返回, 他不需要再等下去了。如果接收失败,他要么直接返回,要么等到缓冲区里有数据之后取得这个数据,然后再返回。第三,接收方从缓冲区里获取数据之后,要么删除该数据, 要么保留该数据,以便其他的接受方能够取得同样的数据。更详细的考虑以及更多有趣的例子,请预约我的多线程技术原理与实战课程。


小白编程困惑之,为何多县城多县城啊,就是让 cpu 同时干多个事啊,那为什么会这样呢啊, 当一个县城啊,访问硬盘或者是网络请求的时候啊,这个时候他并不占 cpu 啊,那只有当硬盘和网络请求返回数据的时候啊, cpu 才会吊起这个县城啊,继续执行啊, 也就是说, cpu 在这种情况下,有一段时间他是空闲的啊,那为了让 cpu 而充分的忙起来啊,所以就有了多现场。 另外呢,一个县城啊,同一时间只能运行在一个 cpu 上啊,现在的机器啊,都是多盒, 所以啊,多线上啊,就成为了充分的又 cpu 的重中之重了啊。欢迎大家关注我,与我交流。

什么是多县城?为什么会有多县城呢?多是一个数量词,表示很多的意思,所以咱哥们只要知道什么是县城,这就可以了。县城的概念呢,非常的拗口,而且在里面还有一个专业名词,进城。所以咱哥们呀,先来解释一下什么是进城, 再回头去解释一下上面的这句话。那么进程呢,它是程序的基本执行实体。举个例子,比如说哥们打开一下任务管理器, 放大你来看,在任务管理期的第一个界面当中,他其实呢就是进程,每一个软件他都对应着一个进程。咱哥们俩可以这么理解,一个软件运行之后,他就是一个进程。看左边 microsoft powerpoint, ppt 的进程,还有下面 typo 笔记的进程,还有画图版的进程,你看是不是每一个正在运行的软件都是一个进程啊?是的呢,好,那么知道了什么是进程,咱哥们呀再回头去看上面的这句话,县城 它是操作系统当中能够运行调度的最小单位,它呢是被包含在进程当中的,它是进程当中实际的运作单位。来举个例子,比如说有一个软件呢,是叫做三六零,在三六零里面它是有很多很多独立的功能的,比如说木马查杀、电脑清理、系统修复、优化加速等等等等。 咱哥们就可以这么去理解,三六零这个软件运行之后,它的本身是一个进程,而三六零里面的木马查杀、电脑清理、系统修复、优化加速,我们就可以把它看作是四个 县城。所以关于县城可以简单理解,县城就是应用软件当中互相独立的,又可以同时运行的功能,那如果说这样的互相独立的能同时运行的功能比较多,就形成了多县城, 那我心里就在想了呀,这哥们他有什么用啊?此时啊,阿伟就要给你讲一个小故事,故事的主人公叫做小白。小白要去工厂打螺丝,这一天呢,他 他愉快的去上班,触犯了一个条例,被扣了一百块钱。但是呢,扣一百块钱不是重点,重点是在干活的时候。小白啊,他是负责一条流水线上的工作,工作的内容就是把流水线上的货物拿下来堆放在一起,但是呢,流水线上的货物他不是连续的, 假设每件货物的间隔时间是十分钟,那你觉得小白是不是搬了一个货物之后就可以摸鱼十分钟啊?是的呢,小白心里非常的爽,但是 老板这心里面就不爽了呀,老板心里想,每件货物结束你都歇十分钟,四舍五入就是没干活呀,你这小子整天闲着,我什么时候才能换劳斯莱斯呀?所以老板呢,就让小白同时负责两条流水线, 其实啊,如果还可以给小白再去加第三条,第四条加更多更多的流水线,小白一会干这个,一会干这个,一会再干这个,此时他是一个人,同时负责三条流水线,工作的效率就得到了提高。你有没有想过,小白为什么 可以同时操作三条流水线,提高工作效率呢?其实啊,是有原因的,它就是把货物间隔的可以用来摸鱼的十分钟充分利用起来了。那么这样呢,小白才能在三条流水线之间进行切换,这样子才能提高工作的效率。那么我们的代码是不是跟这个故事也有类似的呢? 说来看这段代码,咱哥们俩来分析一下过程。在运行的时候, cpu 首先呢,先是读到了第一行代码,那么在内存当中就会创建一个变量 a, 但是内存当中创建变量是不是要时间啊?虽然说这个时间很短很快,但是他也要时间,那么在创建的过程当中, cpu 他是没有办法继续运行下面的代码的,所以 cpu 只能先等。 那假设 cpu 呢,是等了零点零一秒,然后呢再去读第二行内核当中呢,再去创建了一个变量币,同样呢,在这一行, cpu 也等了零点零一秒,同理第三行也等了零点零一秒,第四行也等了零点零一秒。那么这个呢,就是我们以前代码的执行过程,以前的代码我们也 叫做单线程程序,因为它是从头往下依次运行的,就跟刚刚故事中的一条流水线是一样的, cpu 不会切换到其他代码中去运行,所以它的效率会比较低。你要注意,多线程程序的特点就是能同时的去做多件事情, cpu 可以在多个程序之间进行切换,把等待的空闲时间充分的利用起来,这就是多线程 大的特点,提高程序的运行效率。那么在实际开发当中,多线城无处不在,比如说软件中的耗时操作,像拷贝或者是迁移大文件,那哥们呀,一般都会是用多线程技术去搞定的, 因为如果说你用单线程,那么在拷贝的过程当中,根本就干不了气啥事情了呀,只能等着。再比如说加载大量的资源文件,特别是在玩游戏的时候, 点击了游戏之后会有这样的一个界面,他会去加载游戏的资源文件,但是在加载的同时,我还想让游戏去做其他的操作,比如说检查一下游戏的版本是否是最新的,比如说让后面的背景图片去 去动起来,再比如说播放一下背景音乐,所以在此时我们就会用到多线城。那么除此之外呢,像所有的聊天软件,所有的后台服务器都有多线城的声音,所以多线城的技术呢是非常的重要的。

你是否经常吃饭的时候打开电子榨菜,刷着视频来下饭?你是否忙碌了一天,看起来自己同时做着几件的工作,到头来也没什么收获?其实你掉入了忙碌的假象。 多县城工作模式常常让你无法专注于工作。曾经的首富比尔盖茨和股神沃伦巴菲特第一次见面的时候,两位大佬不约而同地给了相同的答案。 focus 专注聚焦于你要做的事情。篮球之神迈克尔乔丹也说过一句话,要如同激光一样的去专注聚焦,而不是手电筒 发散。现实生活中,我们往往不需要做到处处都完美,在你擅长的领域、热爱的领域,做到极致,你就能带来巨大的收益。爱因斯坦不需要很会滑雪,但他 他照样做出了震惊世界的贡献。让我们进度深度的工作,去体验新流,找到属于你自己的节奏吧!

之前有同学在评论区留言,让讲一下什么场景下使用并发编程,那么今天就来还愿了。在考虑哪些场景使用并发编程之前,我们先看一下使用并发编程能给我们带来哪些好处。 如上三点,它可以提高 cpu 的使用力,从而也可以降低我们业务的处理时间,还可以增强我们系统的健壮性。 具体的内容呢,我在上面写的很清楚了,这里就不啰嗦再讲了,让我们知道它的好处以后,那我们肯定知道怎么用才能发挥它的好处,对吧?所以下面我又列了几个常见的使用场景, 第一个呢,就是并行计算,第二个,一步操作。第三个, i o 密集型任务的一个使用。前面两个其实比较通俗易懂,对于这个 i o 密集型任务呢,我大概解释一下,就是说你的系统大部分情况下都在处理网络的 i o, 因为 i o 它是我们整个 编程中其实是最耗时的一个环节,因为它涉及到内核系统跟我们用户太系统之间的一个切换,还有数据的拷贝以及网络传输的过程中,整个 io 呢,可能相对来说等是比较久的,这个久只是针对于整个计算机来讲啊,其实他有在我们人的感知来说,他其实也并不是很久。 那么这个等的话呢, cpu 可能会处于空闲状态,这个时候呢,我们就可以让 cpu 去执行一些其他现成的计算类的任务,这个时候也可以去使用并发编程。总而言之就是一句话,让 cpu 的效率最大化,不让他闲着就是了。 最后呢,我们再看一下并发编程的缺点,因为任何事情都是有好有坏的,并发编程竟然给我们带来了这么多的好处,那他肯定也有一定的问题。他的问题第一点呢就是我们最常见的县城安全的问题。 对,尤其是对于访问共享资源,容易出现并发问题,如果说你的变量都在一个县城之间,那其实是不会出现这种问题的。第二个呢,就是我们在使用县城池的时候,要合理的去控制他县城的一些参数的大小,还有我们的一些拒绝策略, 防止创建县城过多,或者季节策略使用不当,把我们的系统直接搞挂了。第三个呢就是并发编程相对来说会提高我们的编程复杂度,因为我们会考虑到县城安全问题,我们会去考虑到县城是怎么一个使用, 再复杂一些的话,我们县城之间的一些同步关系可能会会有县城之间的互动,所以我们整个编程会变得很难,当然这个难只是相对于你单县城来说难哦,其实也没有多难。嗯,最近状态不太好,就今天就先讲这么多吧,有什么问题的话可以在评论区或者私信直接问我就好了。