python基础16-并发编程(1)

从这篇开始我们学习python并发编程的内容,之所以把并发编程放到最后去说,是因为并发编程涉及很多概念,还用到了类,跟之前的基础知识不同,不是几句话或者几行代码就能说清楚的,在我们正式写代码前我们先梳理下基本概念,然后再进入实际代码环节,因为要NB,不但要会写代码,而且还能理解代码背后的意义,if  赞同:   我们先来了解下进程和线程的历史:

我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构)的出现,可以满足多个运行单位,而多进程并行开销过大。 这个时候就引入了线程的概念。 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合 和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。 线程没有自己的系统资源,只拥有在运行时必不可少的资源。但线程可以与同属与同一进程的其他线程共享进程所拥有的其他资源。

以上这段来自互联网,关于进程和线程说的比较清晰,所以为了让大家更好的了解,我这边直接引用了,在了解了进程和线程后,我们再来看Python中的并发实现,不用想,Python中一定有这种类似模块,没错,这个模块就是threading,  不过学习Python的人都知道,在python中有这么一个玩意儿,叫GIL,中文名叫全局解释器锁,这个锁能保证同一个时刻只有一个线程在运行,这个就保证了在python内部是线程安全的,解决了线程间数据一致性和状态同步的困难,但问题来了,这问题就是你即使编写的多线程代码,运行时其实还是在单线程执行,没法实现真正的多线程,看到这些是不是心里哇凉哇凉的, 不过这些大家也不必过多担心,这里说的情况是CPU密集型的情况,如果是IO密集型的情况下是允许其它线程在这个线程等待I/O的时候运行的,所以结论是,Python的多线程在多核CPU上,IO密集型的程序能更适合利用多线程。

写到这,理论部分就完了,接下来进入我们代码实战阶段,我们从一个实际的运维工作例子中来,比如你们公司有100个站点需要维护(理论上可以测试更多数据,但为了更快演示我只选了100个),你需要定时检测这些站点是否可以正常访问,我们以此需求背景来完成这个代码例子,首先我们用常规方法编写代码,然后在用threading模块实现并发,然后对比看效果,代码如下:

判断一个站点是否正常,最常用的方法就是获得这个站点的http状态码,在这里我简化了需求,只把获得的状态码写入到了文件中, 如果要做监控可以读取这个文件,如果不是2xx或3xx的,就可以报警了,我们把要检查的站点写入urls.txt文件中,通过for循环,调用get_site_code()函数将获得的站点状态码写入site_stauts.txt文件中,加入time模块主要就是对比先后运行时间,运行结果:

执行完成一共花了17秒时间,接下来我们采用并发方式修改下这个执行代码,如下:

运行结果如下:

我们看只用了2秒,快了8倍,看完结果接下来我们说下代码,在这例子里我选择了我个人认为最简单的方法,就是在实例化每个Thread对象的时候传入了我们定义的函数get_site_code()和需要的参数url, 实例化后得到一个Thread的实例t,我们把这个t加入线程列表threads中,接下来循环这个列表开始调用start()函数去执行,除了start()函数,我们还用到了join()函数,这个函数允许主线程等待线程结束.

上面的方法没问题后,我们来看第二个实现方法,我们还可以通过继承父类 threading.Thread,来实现一个子类,通过实例化我们自己的子类来实现并发,这里我们需要注意的是run方法是父类的一个方法,我们在子类中重新了父类的run方法,代码实现如下:

这个脚本跟上面运行效果是一样的,但是通过继承父类的方式来实现的,关于类的继承上篇我们已经讲过了,在代码里我注释了一行,保留了子类继承父类的二种方式的写法,写到这,可能有的小伙伴要问,为什么要有这种方式实现呢?这是因为类对比函数来说可以实现更多更灵活的应用场景,比单纯的函数要强大,所以有时候必须要用这种方式去实现。

这篇就到这里, 在最后,我们回到前面我讲的GIL的问题,如果有的时候就需要用Python来实现利用多核CPU的情况怎么办,办法是有的,就是采用多进程方式,不过这就用到了multiprocessing模块,关于这个模块我们下篇再继续, 另外码字不易,感觉不错的小伙伴请点右上角帮忙转发,多谢。

python基础15-面向对象编程(3)

上篇我们说了类的基本概念,这篇我们谈谈类的一个很重要的概念-继承, 在工作中使用类继承非常常见,当我们编写一个类时并非每次都要从头实现一个类,如果你要实现的类在方法或属性另一个类里已经有了,这时候可以通过继承来自动 获得这个类的所有属性和方法,这个类就叫父类,继承父类的类我们叫子类,通过类的继承,可以让我们减少我们同一段代码要输入好几次的情况,Python允许子类继承多个父类,这种特性我们叫多重继承,这个不是python语言特性,c++也是一样,接下来让我们了解下如何通过代码的方式实现类的继承。

我们还用我们上次定义的Car类来说明继承关系, 代码如下:

这个类我加了一个方法,用来展示汽油用来信息, 现实中我们知道除了汽油,现在电动车也非常流行了,所以我们如果我们需要定义一个电动汽车的类,我们会发现同样在初始化类的时候也需要公司,品牌,生产时间必须的参数,因为这些信息在Car这个类在初始化的时候已经定义了,所以我们可以直接继承Car来实现我一个新的电动车的类,代码如下:

短短二行就实现了父类的继承,代码一会解释,主要是super函数,我们先看结果是否跟我们想的一样,因为根据继承的概念,如果子类继承了一个父类,就会获得父类所有的属性和方法,那接下来让我们看看是不是这样的:

打印出:

可以看到在我们子类Evcar中,我们并没有定义get_car_info这个方法,但我们一样可以直接使用,说明子类继承了父类的方法,直接调用了父类的方法打印了信息,这时候我们输出子类的__bases__属性(__bases__类属性包含了其父类的集合元组),如下:

显示父类是Car。

我们说回代码中的内容, 关于继承父类_方法,现在因为python版本出于2和3交替阶段,写法也有不同,汇总2个方法如下:

1、用super函数,这个函数的目的就是帮助程序员找出相应的父类,然后方便调用相关的属性和方法,在版本2中写法就是跟我上面的例子一样,在3中去掉了super函数中的2个参数,直接调用即可。

2、在子类中显示调用父类初始化,例如:上面的super函数行可以替换成这样:

上面我们了解到了子类和父类的概念,也了解了一个子类如何继承一个父类的属性和方法,接下来我们要看看如何覆盖父类的方法,那为什么要覆盖呢,因为有时候我们从父类中继承的一些方法,不一定能满足或适合子类使用,这时候子类就可以重新这个方法,来实现对父类方法的覆盖,例如我们的例子,petrol_used()这个方法显示不适合用在电动汽车上,那这时候我们可以在子类中重新这个方法,如下:

方法名词同父类相同, 这时候我们调用父类和子类同名的方法会得到如下信息:

从结果看子类的方法被运行了,实现了我们子类的方法覆盖了父类的方法。

关于类对基本内容就写到这里了,希望小伙伴们在了解了基本概念的基础上,多在项目中运用,逐步体会面向对象的编程思想,下篇我们谈一下python的并发编程,我们的基础内容就全部结束了,感谢大家支持。

 

Sublime text3 安装和配置

pycharm 实在是太大了,就启动就需要至少1G内存,无奈电脑配置太低,打算换一个编辑器了,今天安装Sublime text3,早就听说名声在外了,不多说,上手:

1、下载 ,http://www.sublimetext.com/3

我下的最新版本3143版,是个exe文件,直接双击安装即可,安装完后是未注册版本,未注册版就是会定时弹出来一个框让你输入授权码去购买,功能没啥问题,可以去购买,如果没钱就只能百度了。

2、安装完配置,第一个包是安装包管理功能,

打开view–>Show console,在底部输入如下代码:

安装有点慢,完成后重启Sublime3,如果在Perferences菜单下看到package settings–>package contro就说明安装成功了。

3、装好这个后基本完成工作的一半了,接下来开始安装插件。

crtl+shift+p 打开命令框,输入Install  然后选择Package Control ,会再出现一个对话框,在这里输入你要安装的插件名字即可。

接下来步骤一样,安装的插件有:

以下来源网络:

Anaconda

Anaconda 是一个终极 Python 插件。它为 ST3 增添了多项 IDE 类似的功能,例如:Autocompletion 自动完成,该选项默认开启,同时提供多种配置选项。
Code linting 使用支持 pep8 标准的 PyLint 或者 PyFlakes。因为我个人使用的是另外的 linting 工具,所以我会在 Anaconda 的配置文件 Anaconda.sublime-settings 中将 linting 完全禁用。操作如下: Sublime > Preferences > Package Settings > Anaconda > Settings – User: {"anaconda_linting": false}
McCabe code complexity checker 让你可以在特定的文件中使用 McCabe complexity checker. 如果你对软件复杂度检查工具不太熟悉的话,请务必先浏览上边的链接。
Goto Definitions 能够在你的整个工程中查找并且显示任意一个变量,函数,或者类的定义。
Find Usage 能够快速的查找某个变量,函数或者类在某个特定文件中的什么地方被使用了。
Show Documentation: 能够显示一个函数或者类的说明性字符串(当然,是在定义了字符串的情况下)

你可以在这里,或者通过 ST3 的 Package Settings: Sublime Text > Preferences > Package Settings > Anaconda > README 来查看所有这些特性。

Djaneiro

Djaneiro 支持 Django 模版和关键字高亮以及许多实用的代码片(snippets)功能。其中的 snippets 绝对是省时神器。你可以通过很少几个关键字就能创建许多常见的 Django 代码块比如 templates,models,forms,以及 views。请查看官方文档获取 snippets 列表。

我个人非常喜欢的以下两个用于创建 template 的代码片:输入 var 就可以新建 {{ }},而输入 tag 就能新建 {% %}。

requirementstxt

Requirementstxt 可以为你的 requirements.txt 文件提供自动补全,语法高亮以及版本管理功能。

MarkDown Editing

SublimeText不仅仅是能够查看和编辑 Markdown 文件,但它会视它们为格式很糟糕的纯文本。 这个插件通过适当的颜色高亮和其它功能来更好地完成这些任务。

Markdown Preview

Markdown Preview 可以用来预览和编译 markdown 文件。 这边文章的预览就是通过 mp完成的。

你可以打开 Package Manager 然后输入 Markdown Preview 来查看可用的命令:

Markdown Preview: Python Mrakdown: 在浏览器中预览
Markdown Preview: Python Mrakdown: 导出 HTML 文件
Markdown Preview: Python Mrakdown: 拷贝到剪贴板
Markdown Preview: Github风格Markdown: 在浏览器中预览
Markdown Preview: Github风格Markdown: 导出 HTML 文件
Markdown Preview: Github风格Markdown: 拷贝到剪贴板
Markdown Preview: 打开Markdown速查手册∏
一旦你完成转换,你之后的所有保存都会立即反映到转换的文件中。

OmniMarkupPreviewer

支持将标记语言渲染为 HTML 并在浏览器上实时预览,同时支持导出 HTML 源码文件。

支持的标记类语言:

Markdown
reStructuredText
WikiCreole
Textile
Pod (Requires Perl >= 5.10)
RDoc (Requires ruby in your PATH)
Org Mode (Requires ruby, and gem org-ruby should be installed)
MediaWiki (Requires ruby, as well as gem wikicloth)
AsciiDoc (Requires ruby, as well as gem asciidoctor)
Literate Haskell

Emmet

(前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具.

使用示例:

在编辑器中输入缩写代码:ul>li*5 ,然后按下拓展键(默认为tab),即可得到代码片段:

JsFormat

代码格式化

  • JsFormat 基于 JS Beautifier,可以帮助你自动格式化 JavaScript 和 JSON。这对于阅读代码是非常有用的。
  • 快捷键:Ctrl + Alt + f 或者,你也可以使用菜单栏。
  • 可定制喜欢的格式:在 SublimeText 3 中 Preferences -> Package Settings -> JsFormat -> Settings – Default 可以调整这些配置。

jQuery:JQuery的API代码片段

我知道目前在很多地方 jQuery 看似已经落伍了,但是如果你不是建立一个交互性很强的网站或者你只是想在已有应用上添加功能,它仍然是非常有用的。

比如,输入 $.a就可以让我选择$.ajax(),然后自动扩展成以下代码:

JavaScript Completions

js代码补全。

CSSComb 
CSS属性的顺序一般不重要,因为无论何种顺序浏览器都能正确渲染。但排序所有的属性还是有助于代码的整洁

SideBarEnhancements

SideBarEnhancements扩展了侧边栏的菜单选项,整体加速你的工作流程,像“New File”和“Duplicate”这样的必须选项应该成为ST3开箱即用的一部分,仅仅是“Delete”选项就是它很值得一用,这个功能只是简单的将文件移到回收站,这可能看起来很平凡,但是如果你不是使用它来删除文件,恢复文件将变得十分困难,除非你使用版本控制系统。

BracketHighlighter

括号,高亮显示

FTPSync:同步文件到Linux环境

最后是安装了sftp这个插件,没用上面的,stp配置比较简单,就是会提示注册,网上找到如下:

取消输入时的小白框在,在user-setting里加入:

{“anaconda_linting”: false}

就这么多吧,第一次装感觉很麻烦,装的插件太多,以下是删除。

移除插件

      有时候我们需要移除自己不想要的插件,具体操作如下:快捷键 Ctrl+Shift+P,在对话框中输入“remove”,选择“Package Control: Remove Packages”。

然后在出现的插件列表中点选你要移除的插件。

参考:

http://blog.csdn.net/liujie19901217/article/details/51042343

http://www.jianshu.com/p/269642c54d2c

http://www.cnblogs.com/wind128/p/4409422.html

http://python.jobbole.com/81312/

日常使用:

跳出自动补全的括号外,按回车即可,加入到key-map user setting里:

 

批量注释:

多行选择后按下ctrl+/

批量缩进:感觉跟Pycharm一样,

 

 

使用Sublime Text时unable read project问题的解决方法

然后以后每次重新打开sublime text都会弹出这样的对话框,解决的办法是

1、删除文件夹C:\Users\Administrator\AppData\Roaming\Sublime Text 3\Local下的两个文件session和seesion.sublime_metrics.

2、关闭sublime text再重新打开就OK啦~

 

这个方法貌似没用,:

解决办法:

在C:\Users\Administrator\AppData\Roaming\SublimeText 3\Packages\User目录下建立一个名为Preferences.sublime-project的文档

文档内容为

关闭软件重新打开就OK了-

另一个问题:

在执行CTags: Rebuild Tags时出现如下乱码。

出现乱码的原因其实是sublime text找不到ctags.exe。所以需要配置CTags的配置文件,

下载ctags可执行程序,路径为http://prdownloads.sourceforge.net/ctags/ctags58.zip,解压到一个目录,例如:e盘下,然后复制

配置:sublime text 3:Preferences->Package settings->CTags->Settings-Default文档里的内容全部复制到 Settings-User里,并修改如下配置:

“command”: “E:\\ctags58\\ctags.exe”,

 以上这些都完成后,t3是不能运行python脚本的,并且如果打开控制台,会发现使用python3的语法没问题,如果是2的语法会报错,当写完后按ctrl+b键,在左下角会出现“ no build system” 提示,咋办呢?

这篇文章给了比较详细的解释,看完后我感觉简直就是像我问的一样:

https://stackoverflow.com/questions/22439238/sublime-text-3-python-build-system-confusion

点tools–bulid system–new bulid system会出现一个空白文本输入,

保存到C:\Users\administrator\AppData\Roaming\Sublime Text 3\Packages\User\python2710.sublime.build

然后回到tools–buld system下,可以看到python2这个选项,不过我没选择这个,我选的Anaconda python build ,然后编写一个文件,ctrl+b,就可以运行了。

 

 

Gitlab 安装

 

选择系统版本:

https://about.gitlab.com/downloads/#centos6

 

1、安装配置依赖

sudo yum install curl openssh-server openssh-clients postfix cronie

sudo service postfix start

sudo chkconfig postfix on

sudo lokkit -s http -s ssh

2、加安装包到安装的server

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bashsudo yum install gitlab-ce

自己之定义版本:

curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/6/gitlab-ce-XXX.rpm/downloadrpm -i gitlab-ce-XXX.rpm

3、配置

sudo gitlab-ctl reconfigure

4、浏览登录

 

On your first visit, you’ll be redirected to a password reset screen to provide the password for the initial administrator account. Enter your desired password and you’ll be redirected back to the login screen.

The default account’s username is root. Provide the password you created earlier and login. After login you can change the username if you wish

 

配置,重启:

 

主机IP更换后需要修改:

vi /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

HOST  XXX

 

修改后重启gitlab,命令如下:

 

gitlab-ctl restart

sleep 3

gitlab-ctl restart nginx

sleep 1

gitlab-ctl status

Centos7 免费SSL证书Let’s Encrypt(certbot)安装

 

 

Centos 7.2

sudo yum install epel-release

sudo yum install certbot

修改你的服务器配置,在server模块添加:

 

重启nginx

sudo certbot certonly –webroot -w /usr/local/nginx/html/ -d www.mindg.cn

配置证书:

 

nginx –s reload

配置自动更新:

302 * *1 /usr/bin/certbot renew >>/var/log/le-renew.log