Prthon多线程和模块
Prthon多线程和模块
1 案例1:简化除法判断
1.1 问题
编写mydiv.py脚本,主要要求如下:
- 提示用户输入一个数字作为除数
 - 如果用户按下Ctrl+C或Ctrl+D则退出程序
 - 如果用户输入非数字字符,提示用户应该输入数字
 - 如果用户输入0,提示用户0不能作为除数
 
1.2 方案
使用if语句判断除数是否合适,需要编写多条语句。有了异常处理,可以本着先做,错了再说的逻辑。直接把除法操作放在try语句中执行,根据产生的异常做相应的处理。
另外,Ctrl+C或Ctrl+D只能通过异常捕获。
异常捕获的语法如下:
- try:
 - A
 - except:
 - B
 - else:
 - C
 - finally:
 - D
 
把可能发生异常的语句放在A里面执行,如果出现异常则执行B语句,没有异常则执行C语句。不管是否出现异常都会执行D语句。
捕获异常时,可以使用多个except语句,每个except语句捕获一个异常,每个异常给定不同的处理方法。也可以把多个异常放在同一个except语句后面,但是务必注意,多个异常写在相同的一行,一定要注括号括起来,放在元组中。
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- #!/usr/bin/env python
 - import sys
 - while True:
 - try:
 - result = 100 / int(raw_input('enter a number: '))
 - except (ValueError, ZeroDivisionError), e: #将异常原因保存在变量e中
 - print "invalid input:", e
 - continue
 - except (EOFError, KeyboardInterrupt):
 - sys.exit(1)
 - break
 - print result
 
步骤二:测试脚本执行
- [root@py01 bin]# ./mydiv.py
 - enter a number: 0
 - invalid input: integer division or modulo by zero
 - enter a number: abc
 - invalid input: invalid literal for int() with base 10: 'abc'
 - enter a number: 3
 - 33
 
案例2:分析apache访问日志
2.1 问题
编写用于分析apache日志的脚本,主要要求如下:
- 统计每个客户端访问apache服务器的次数
 - 将统计信息通过字典的方式显示出来
 - 分别统计客户端是Firefox和MSIE的访问次数
 - 分别使用函数式编程和面向对象编程的方式实现
 
2.2 方案
涉及到文本处理时,正则表达式将是一个非常强大的工具。匹配客户端的IP地址,可以使用正则表达式的元字符,匹配字符串可以直接使用字符的表面含义。
入门级程序员的写法,使用顺序的结构,直接编写。这种方法虽然可以得出结果,但是代码难以重用。参考步骤一。
进阶的写法可以采用函数式编程,方便日后再次使用。参考步骤二。
最后,还可以使用OOP的编程方法,先定义一个统计类,该类将正则表达式作为它的数据属性。再定义一个方法,从指定的文件中搜索正则表达式出现的次数,并将其存入到一个字典中。参考步骤三。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:简单实现
- [root@py01 bin]# vim countweb.py
 - #!/usr/bin/env python
 - import re
 - logfile = '/var/log/httpd/access_log'
 - cDict = {}
 - patt_ip = '^\d+\.\d+\.\d+\.\d+' #定义匹配IP地址的正则表达式
 - with open(logfile) as f:
 - for eachLine in f:
 - m = re.search(patt_ip, eachLine)
 - if m is not None:
 - ipaddr = m.group()
 - #如果IP地址已在字典中,将其值加1,否则初始值设置为1
 - cDict[ipaddr] = cDict.get(ipaddr, 0) + 1
 - print cDict
 
步骤二:使用函数式编程实现
- [root@py01 bin]# vim countweb2.py
 - !/usr/bin/env python
 - import re
 - def countPatt(patt, fname): #定义可以在指定文件中搜索指定字符串的函数
 - cDict = {}
 - with open(fname) as f:
 - for eachLine in f:
 - m = re.search(patt, eachLine)
 - if m is not None:
 - k = m.group()
 - cDict[k] = cDict.get(k, 0) + 1
 - return cDict
 - def test():
 - logfile = '/var/log/httpd/access_log'
 - patt_ip = '^\d+\.\d+\.\d+\.\d+'
 - print countPatt(patt_ip, logfile)
 - patt_br = 'Firefox|MSIE'
 - print countPatt(patt_br, logfile)
 - if __name__ == '__main__':
 - test()
 
案例3:扫描存活主机
3.1 问题
编写扫描存活主机的脚本,主要要求如下:
- 调用系统的ping命令进行扫描
 - 扫描教室环境下所有存活的主机
 - 采用多线程的方式编写
 - 方案
 
os模块的system()函数可以调用系统命令,其返回值是系统命令退出码,也就是如果系统命令成功执行,返回0,如果没有成功执行,返回非零值。
本例扫描主机,可以调用系统的ping命令,通过退出码来判断是否ping通了该主机。如果顺序执行,每个ping操作需要消耗数秒钟,全部的254个地址需要10分钟以上。而采用多线程,可以实现对这254个地址同时执行ping操作,并发的结果就是将执行时间缩短到了10秒钟左右。
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@py01 bin]# vim mtping.py
 - #!/usr/bin/env python
 - import subprocess
 - import threading
 - import sys
 - def ping(ip):
 - result = subprocess.call("ping -c2 %s &> /dev/null" % ip, shell=True)
 - if result:
 - print "%s:down" % ip
 - else:
 - print "%s:up" % ip
 - if __name__ == '__main__':
 - if len(sys.argv) != 2:
 - print "Usage: %s subnet" % sys.argv[0]
 - sys.exit(1)
 - net_list = sys.argv[1].split('.')
 - net = '.'.join(net_list[:-1])
 - ips = ("%s.%s" % (net, i) for i in range(1, 255))
 - for ip in ips:
 - t = threading.Thread(target=ping, args=(ip,))
 - t.start()
 
步骤二:测试脚本执行
- [root@py01 bin]# python mtping.py 172.40.51.0
 
脚本接受命令行参数,只要给定网段就可以实现对该网段中所有ip地址的ping操作。
案例4:利用多线程实现ssh并发访问
4.1 问题
编写ssh客户端脚本,主要要求如下:
- 在文件中取出所有远程主机IP地址
 - 在shell命令行中接受远程服务器IP地址文件、远程服务器密码以及在远程主机上执行的命令
 - 通过多线程实现在所有的远程服务器上并发执行命令
 - 方案
 
python的paramiko模块可以实现ssh客户端的功能,使用起来也比较简单。但是当服务器非常多的时候,每台服务器上执行完全相同的简单操作,也会花费大量的时间。
通过ssh加上多线程,可以实现并发访问。为了将程序写的灵活性更强,把要执行的命令以位置参数的方式来提供。
4.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@py01 bin]# vim remote_comm.py
 - #!/usr/bin/env python
 - import paramiko
 - import os
 - import sys
 - import threading
 - def remote_comm(host, password, comm):
 - ssh = paramiko.SSHClient()
 - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 - ssh.connect(host, username='root', password=password)
 - stdin, stdout, stderr = ssh.exec_command(comm)
 - out = stdout.read()
 - err = stderr.read()
 - if out:
 - print "[%s:out]: %s" % (host, out),
 - if err:
 - print "%s:Error: %s", (host, err),
 - ssh.close()
 - if __name__ == '__main__':
 - if len(sys.argv) != 4:
 - print "Usage: %s ipfile password 'comm'" % sys.argv[0]
 - sys.exit(1)
 - ipfile = sys.argv[1]
 - if not os.path.isfile(ipfile):
 - print "No such file: %s" % ipfile
 - sys.exit(2)
 - password = sys.argv[2]
 - comm = sys.argv[3]
 - with open(ipfile) as fobj:
 - for line in fobj:
 - ip = line.strip()
 - t = threading.Thread(target=remote_comm, args=(ip, password, comm))
 - t.start()
 
步骤二:测试脚本执行
- [root@py01 bin]# python remote_comm.py ipaddr.txt tedu.cn 'useradd bob'
 
脚本接受命令行参数,其中ipaddr.txt是存放所有远程主机ip地址的文件,文件中每个ip地址占一行。tedu.cn是远程主机的密码(所有远程主机密码需要是一致的)。最后的命令需要写在引号中。
该示例执行成功后,会在所有远程主机上创建一个名为bob的用户。
Prthon多线程和模块的更多相关文章
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
		
由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...
 - 网络编程 多线程/socketserver模块/ threading.local
		
线程:进程中负责程序执行的执行单元. 多线程:在1个进程中存在多个线程. 进程只是用来把资源集中在一起,而线程才是cpu上的执行单位. 每个进程都会默认有一个控制线程也叫作主线程. 进程之间是竞争关系 ...
 - 再看python多线程------threading模块
		
现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个“,”否则会抛参数异常的错误. 如下: for i ...
 - day 30  多线程 socketserver模块补充
		
内容回顾: socket 模块 服务端:收发数据 - > accept/recv 客户端:收发数据 -> connect/recv 1. 考试题 1. 解释性和编译型 编译型: 先把代码编 ...
 - 多线程threading模块
		
python的多线程编程 简介 多线程编程技术可以实现代码并行性,优化处理能力,同时功能的更小划分可以使代码的可重用性更好.Python中threading和Queue模块可以用来实现多线程编程. 详 ...
 - Python:多线程threading模块
		
目录 Thread对象 Lock对象 local对象 Thread对象: 多任务可以由多进程完成,也可以由一个进程内的多线程完成.进程是由至少1个线程组成的. threading模块在较低级的模块 _ ...
 - python编程中的并发------多线程threading模块
		
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...
 - Python_多线程threading模块
		
python 在执行的时候会淡定的在CPU上只允许一个线程运行,故Python在多核CPU的情况下也只能发挥出单核的功能,其中的原因:gil锁 gil 锁 (全局解释器锁):每个线程在执行时都需要先获 ...
 - Python(多线程threading模块)
		
day27 参考:http://www.cnblogs.com/yuanchenqi/articles/5733873.html CPU像一本书,你不阅读的时候,你室友马上阅读,你准备阅读的时候,你室 ...
 
随机推荐
- 使用.Net Core编写命令行工具(CLI)
			
命令行工具(CLI) 命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. 通常认为,命令行工具(CLI)没有 ...
 - HashMap底层源码剖析
			
HashMap底层源码剖析 一.HashMap底层用到的数据结构 数组+单向链表+红黑树 数组:数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:当法神hash碰撞时,首先会找到数组对应位 ...
 - python基础学习day4
			
列表的初识 why:int bool str str: 存储少量的数据. str:切片还是对其进行任何操作,获取的内容全都是str类型.存储的数据单一. what:list list = [66, ' ...
 - touch.js——手机端的操作手势
			
TOUCH.JS手势操作,例如一指拖动.两指旋 基本事件: touchstart //手指刚接触屏幕时触发 touchmove //手指在屏幕上移动时触发 touchend //手指 ...
 - 从 Spring 的环境到 Spring Cloud 的配置
			
需求 不知不觉,web 开发已经进入 “微服务”.”分布式” 的时代,致力于提供通用 Java 开发解决方案的 Spring 自然不甘人后,提出了 Spring Cloud 来扩大 Spring 在微 ...
 - 《Python学习手册 第五版》 -第17章 作用域
			
上一章的是函数的基础,因为函数在运用过程中,是可以嵌套的,函数中是会涉及到变量的,为了明确各自变量的使用范围,系统是有一套规则或者原则的,这就是作用域的概念 本章重点内容 1.作用域:作用域的概念 2 ...
 - Fluent算例精选|03利用VOF和蒸发-冷凝模型
			
通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...
 - SpringMVC框架——转发与重定向
			
网上摘取一段大神总结的转发与重定向的区别,如下: 转发(服务端行为) 形式:request.getRequestDispatcher().forward(request,response) 转发在服务 ...
 - Alterations of brain quantitative proteomics profiling revealed the molecular mechanisms of diosgenin against cerebral ischemia reperfusion effects(大脑的定量蛋白质组学揭示了薯蓣皂苷元对脑缺血再灌注效应的分子机制)
			
文献名:Alterations of brain quantitative proteomics profiling revealed the molecular mechanisms of dios ...
 - Ansible权威指南-读书笔记
			
2 Ansible基础元素介绍 2.1 ansible 目录结构介绍 2.2 ansible 配置文件解析 配置文件解析顺序:当前命令执行目录-->用户家目录下的.ansible.cfg--&g ...