00:00
好,那么我们接下来呢,再写一个execd版的Python查看文件数目的input插件啊,那么execd和exec有什么区别呢?其实对于telegraph来说,Eec呢,就是我每到这个时间就去执行一下你给定的命令,那么ECD呢,其实是啊,在我开启的时候执执行一下你给定的命令,那么后面呢,就是会将你这个程序的,呃,会将你这个启动的程序作为一个守护进程来进行管理。那么什么时候用exec,什么时候用execd呢?啊,那很简单,假如说你这个脚本里面啊,它有一些需要啊,远程连接某个数据库或某个什么东西的这个场景啊,他要去创建一个连接对象,而且呢,在这个过程中呢啊,反复创建对象呢啊可能有一些性能上的开销,呃,那么这个时候呢,你就应该把它作为一个守护进程啊,要不然的话,这个呃,他的graph呢,它用exec啊,它每次启动这个呢,启动这个程序还得退出这个程序,那么来回呢,它就是一种开销啊,那么用我们的这个execd版,把你这个程序呢,当做一个守护进程啊,让他在后台常驻啊,那么这反而是一个比较好的方案。
01:14
那么接下来呢,我们就去写一个常驻版的啊,这个查看文件数目的input插件啊,还是打开我们的Vs code,把这个屏幕清一下。然后这一次呢,我这个程序叫做DR那。EXECD.pi哎,重命名一下。点二好,OK啊,那么现在呢,就是我们创建好了自己的这个脚本,接下来我们写我们的逻辑,呃,这个地方呢,我们就先截个图,把它盯在屏幕上啊,对着写就可以了。呃,在这个过程中呢,我会给大家解释一下这里面一些呃代码什么意思?呃,上面呢,还是以我们上一次用的这个包,一个是global。
02:05
一个就是我们的赛。好,但这个size呢啊,我们后面待会儿会用,这次呢,我们先引一个time和我们我现在七号代码呢,和我右边的代码还不是完全一样的啊呃,我声明一个table。Template,然后呢?这一段我直接去复制。就把上一个脚本的直接拿过来,然后呢,这个删掉啊,这个删掉,呃,接着呢,我们还是去获取啊,获取命令行里面的参数。还要通过S2个V,然后呢来获取这个参数,接下来呢,我写一个VIVO处,从这个地方呢,和我右边这个截图里面的不一样了啊,大家注意VIVO处。啊,围绕错之后呢,然后我们pass。
03:00
Phnom。直接使用这个global的底下的方法。来拿我这个路径下的所有的文件数量,文件的这个对数量,然后再套一层。啊,这样呢,我们就能拿到这个列表的一个长度啊,接下来呢,就是把这个数据呢,直接打印一下啊print。对吧,已经有这个数量了,就直接。Form,然后那等于我们这里的pass。好,那么这个东西打印完之后呢?呃,我们直接让他睡上三秒。啊,这次我不睡三秒了,我睡几秒呢?啊,我要不我睡个八秒吧。啊,这里面呢,给的参数实际上就是秒数好,那么我们现在呢,啊,就成功的写了一个可以说是守护进程啊,啊我们现在呢,把这个代码啊复制粘贴。
04:02
然后在还是在我们这个目录下,我们再去创建一个DR r name,然后这里呢,把这个eec改成eecd啊,然后接下来把我们的代码粘进来。好,那么我们现在呢,就写了一个,你看这个逻辑很简单,他其实就是在启动的时候呢,去拿一下这个啊路径的,我们给的这个路径参数啊,接着呢,就是每隔八秒钟对吧,每瞬八秒钟把这个呃,路径底下的长度呢给打印一下,我们现在看呢,如果这样执行,它会有一个什么样的效果?好,现在保存退出,紧接着呢,我们要去写一个配置文件啊,这次呢,我们创建一个eec02.com然后这个配置文件的内容还是去我们的文档里面复制粘贴。嗯,找一下之前那个配置文件,应该是这个对。好,复制。
05:00
粘贴啊,那么这个地方呢,我们给大家说一下,之前呢,我们看的那个eec呢,是commands啊,其实侧面的一个说法呢,就是啊,我先退出保存,我们看一下EEC01这个文件。之前呢,我们看到这个命令呢是commands,然后后面呢,跟跟跟的是一个列表的数据类型啊,这个意思就是说其实exec呢,它还能允许你啊,在每隔三秒之后运行多个命令,然后把这多个命令的输出呢,都当做一批输入来进行处理啊,不过我们这里呢没有这么用,我们这里呢只给了一个命令啊,大家知道就好啊,我们再继续看这个零二的配置文件,那么这里呢,就不是commands了,这里面是一个command,也就是这里呢,其实只能传一个命令,那么这个数组呢,我们可以看到,呃,它用逗号隔开了很多东西,那么逗号隔开呢,其实就是啊,相当于把我们命令里面的空格啊给隔开了啊,到最后呢,这个命令呢,会给会用这个这个这个会用空格给它拼起来,就逗号的位置呢,会被空格代替啊是这个意思,呃,那么在这里的话,我们的路径还是需要改一下,因为我们现在呢,在这里创建了一个。
06:11
对,创建了一个script的子目录来,C RI I ptr I ptr ipt,好,那么还是看我们这个home I硅谷下面的所有文件的一个啊数目,这里呢,特沃三秒,大家注意啊,待会会发生什么。还有一个就是这个地方,我可以先给大家助讲啊,先给大家助脚。好,我们现在呢,用telegraph来跑一下这个配置文件。我们可以看到这个程序呢,已经起来了,呃,这个因特网呢,就是说呃抓数据的,呃这个间隔呢是三秒,呃刷写数据的时间呢是五秒,我们可以等一会。
07:05
啊,那么这里呢,可以给大家预告一下啊,就是这里面不管你等多长时间,你等一年也好啊,啊一年有点夸张,你可能等半小时它也不会出现数据啊,你可以看到现在可能已经十几秒过去了,但是我们还是没有数据出现,呃,之前这个代码呢,写的是睡眠八秒,但是这个时候呢,也应该有一批数据了,但是我们这里呢,就是没有数据啊,这是为什么呢?啊,这是因为你没有刷写缓冲区,你看我当我CTRLC的时候,当CRC把这个程序刷掉的时候,他说啊,Hang on a flash any cash的。呃,Matricx before shutdown就是说在停的时候会把缓冲区里的数据全部给它写出来,你可以看到这个,其实这个时候呢,其实缓冲区里面是有数据的,但是为什么我刚才跑这个EEC02的时候呢,它不会出现数据呢?啊这是为什么?这就是因为呃,我这个代码在写的时候呢,我的print虽然说是把这个数据呢打印到了标准输出,但是它实际上在哪里呢?它实际上是在诶自己的缓冲区里面,这里呢,你必须要去手动在Python啊,就对Python而言,你必须要手动去刷新缓冲区,刷新缓冲区的方式有两个在Python里面,一个是你可以在print里面用flash这个参数给上一个错,这样的话呢,啊,你的这个缓冲区每次打印完之后呢,就会被手,就会被这个自动刷新,另外一个就是你可以通过S的这个,呃,API,我们可以看一下,就是S的API实际上是。
08:40
啊,S s t do是吧,标准输出。第2FLASH你要调这个方法,就强行把这个呃打印的。这个缓冲区给它强行刷写掉啊,那么我们现在呢,用这种方式print里面呢,加上一个flash等于出的参数,我们看一下啊,效果会怎么样,我们还是去编辑我们的,呃,这个脚本D。
09:08
ECD好,编辑这个脚本的时候呢,我们去像刚才在Vs code上编辑的一样,Flash等于true出,然后退出,保保存退出。呃,还是用我刚才的命令再次运行EEC02的这个文件,我们看一下啊。这次会不会输出数据你可以看到啊,这次我们的数据正常输出了,而且这个时间戳呢,也给我们补上了啊,这就是我们说的这个呃刷写缓冲区的问题,所以说在编写这个常驻进程的时候呢,一定要注意啊,那么之前我们这个eec版的脚本为什么可以呃输出这个呃这个这个字符串呢,那是因为。这个Python呢,它在退出的时候啊,退出之前它一定会刷写缓冲区,所以说你这个刷写缓冲区呢,之前实际上是因为你程序退出了啊,程序退出给的一个操作,那么还有一种什么条件下会触发这个啊缓冲区的一个刷写呢,实际上就是我们的缓冲区满啊,缓冲区写满了啊,自然也会刷写,那么按照你当前这个睡眠时间呢,可能估计要啊十几分钟,这个情况呢,你到时候要自己把握啊,所以说呢,如果说你想立刻看到数据,一定要记得刷写,手动刷新缓冲区。
10:24
好,那么接下来呢,我们再说一下这个我们之前的这个代码里面,诶为什么我的这个这边写的是for循环,后来我们在这个跑的时候写的是V循环的,好给大家讲一下这个是为什么。呃,首先呢,我们先指出刚才程序的一个问题啊,就是我这里呢,睡眠八秒钟是写死的,那么外面这个配置文件呢,它其实我们可以看外面这个配置文件,外面这个配置文件呢,实际上希望我三秒钟呢,就能进行一次数据的抓取,也就三秒钟呢,就去看一下这个目录底下有多少文件。
11:00
好的,那么我们来看下一个点,呃,就是我们可以看到啊文档里的代码呢,我写的是放循环,但是呢,呃,我现在这个录视频的时候呢,我写的是V,错,为什么呢?其实就是就是想告诉大家啊一个问题,首先呢,要看我们程序目前所存在的一个问题,呃,按照配置文件的意愿呢,其实我希望你这个输入插件呢,能够每三秒钟就去看一下艾特硅谷啊下面这个目录有多少文件,但是呢,你当前的这个,呃休眠时间呢,是你在代码里面直接写死的,跟外部的这个环境呢没有关系啊,那么这样一来呢,实际上呃,就相当于你这个,你这个插件呢,虽然说我也跟我的这个telegraph搭上勾了,但是呢,你没有,你没有按照我的意愿去配置化啊,那么怎么办呢?其实我们可以通过一个信号传递的方式来让这个我们Python的程序知道,诶,三秒钟到了,可以进行一次数据的采集。那么首先呢,我们从这个for循环开始讲起啊,这个for循环呢,它的作用呢,其实是一个阻塞的方法,就是它呢会阻塞到这个屏幕上,就标准输出上,然后等待你的这个啊键盘进行输出,我们可以跑一下先试试啊,这个地方呢,我就是一个放循环,然后对这个对象呢进行放循环,然后放循环的时候呢,我把这个循环到的值来打印一下,你大家就大概知道什么情况了。
12:30
好好,那么下面这个呢,一定要注掉,因为要不然的话会报这个数组的越界异常啊。好,我现在运行你可以看到呢,我这个程序呢啊,它什么也没有打印,它就在这阻塞死了,我们我们看一下hello漏,我们现在就输呃,就键键盘啊,输入一下海漏,然后按下回车啊,你会发现啊,它直接给我打印了一个艾特硅谷海漏啊那么为什么这里面会有一个回车呢?实际上是因为我的这个输入里面也带一个回车啊,我们现在呢,先把这个程序停一下,CTRLC停一下,然后呢给他让他让他以空字符串L结尾,我们看一下它会打印什么。
13:10
好,我说海陆诶,他打印艾特硅谷海是吧,然后我再打印你好,他打印艾特硅谷你好啊,也就是说这个方法其实是啊,循环的这个其实是阻塞在我的这个输出输入上,然后等待着我的输入,一旦有的输入呢,它就会执行这个for循环内部的逻辑啊,也就这个意思,那么我们在这里呢,我们写一个for I啊,或者说我们这个变量,我们不需要我们直接放下划线,然后把我们的这个代码放开啊,然后再把这个删掉。诶,这样的话time sleep我们也可以删掉了,这样的话呢,就是说呃,我的放循环在这阻塞的等着这个标准输入,一旦这个输入里面有东西呢,他打了回,呃,他打了这个换行符,诶我就接着执行我们下面的这个逻辑,好大家再来看我们的配置文件,有一个什么signal信号,诶他可以向这个脚本的这个服务里面呢,啊传递信号,通过什么传方式传递信号呢?啊其实这里是可以选的,我们这里选的是s tdin,也就是标准输入,说白了,我们刚才在这里面键盘敲的这些东西不都是标准输入吗?这样的话,我们的telegraph会每隔三秒钟,每隔三秒钟,就像我们的这个,呃,Di name input exec脚本,对吧,让他跑到这个程序里面发送一个标准输入,你不用管这个内容是什么,你得知道它是一个三秒钟倒了的信号就行啊,所以说呢,我们可以把这个三秒钟直接这样通过这个放循环的方式啊,通过放循环和stdin的方式给拿到。
14:46
啊,当我这个程序知道,哦,这里面标准输入里面有东西了,我就立刻执行下面的程序,然后把我的这个要拿到这个pass pass底下的文件数目给它输出出来,这就是我们让这个Python程序呢,去得知telegraph信号的方式,好,接下来呢,让我们尝试运行这个新的代码,首先呢,啊,Time,我们不用time sleep了,所以说这个呢用不到了,把它删掉,然后呢,我们先去观察一下之前的数据啊,把这个先保存退出,然后我们可以看到啊,之前的这个数据是以多大间隔作为一个输出的。
15:20
我们可以看到这里呢,就是有零零加八等于九是吧,零加八其实不等于九,但是类近似了啊,可能因为稍微的延迟,但是九加八呢,九加八是不是等于七呢啊,七加八是不是等于五呢?是吧?你看这个进位的取舍,所以说呢,我们现在可以判断啊,数据的这个,呃,数据的这个输输入的这个时间呢,它实际上就是以八秒钟为间隔的啊,那么我们接下来呢啊,再去再去编辑一下我们的这个脚本,首先呢,我们把刚才e secd这个代码清空,我们可以用这种方式。好,那么现在呢,我们这个eecd这个文件呢,就被我们清空了,我们现在呢,去把新的代码复制进来。
16:05
好,那么现在呢,就是我们新版的脚本WQ退出,然后现在呢,我们可以再去跑这个命令了。那再去跑这个SEC002了啊,跑起来之后看看效果。好看这个flash特沃是五秒钟。嗯,这里为什么呢?是因为我刚才呢,忘了去修改这个配置文件了,因为我刚才把这个signal给注掉了,对吧?好那么现在呢,所以说他没有发送信号,那个程序一就一直死在那好现在呢。保存退出,这才正常,好,等一下这个数据的输出,我们看看结果。
17:01
诶,可以看到我们的第一条数据出来了,等这个刷减时间五秒之后呢,我们看另外的数据,诶现在别的数据也出来了,我们可以看到呢,二加三是不是等于五,五加三是不是等于八,八加三是不是等于进位,然后为一个位为一,然后一加三等于四,现在呢,也就说明我们这个输入的这个数据呢,它其实是以三秒为间隔进行产生的啊,所以说我在这里CRLC一下,我们再去修改这个啊配置文件,我们现在呢,我不想三秒钟了,我就想一秒钟,我看我们的这个脚本能不能拿到,能不能干到这个程度。再看。你看是不是12345直接下来的,所以说呢,现在这个这个程序呢,已经可以跟我们这个啊配置文件里面的间隔时间保持一致了啊,这就是我们为什么要在这个Python里面呢啊,使用for循环这个方式等待标准输入,然后来打印这个啊数据啊,这就是我们这么做的目的,好,那么我们呢,呃,Python写的exed版的input插件也就讲到这里了。
我来说两句