twisted 示例文件传输

服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env python
# -*- coding:utf-8 -*-

# This is the Twisted Fast Poetry Server, version 1.0

import optparse, os

from twisted.internet.protocol import ServerFactory, Protocol


"""
这个函数定义了服务端执行的参数有2个port和iface【端口和网络接口】以及返回获取参数和值以及文件名路径
"""

def parse_args():
usage = """usage: %prog [options] poetry-file

This is the Fast Poetry Server, Twisted edition.
Run it like this:

python twisted_sendfile.py <path-to-poetry-file>

If you are in the base directory of the twisted-intro package,
you could run it like this:

python twisted-server-1/fastpoetry.py poetry/ecstasy.txt

to serve up John Donne's Ecstasy, which I know you want to do.
"""

# 实例化OptionParser
parser = optparse.OptionParser(usage)

# 关于port参数的相关定义,帮助是的说明,传值的类型,
help = "The port to listen on. Default to a random available port."
parser.add_option('--port', type='int', help=help)

# 关于iface参数的相关定义,帮助是的说明,传值的类型,
help = "The interface to listen on. Default is localhost."
parser.add_option('--iface', help=help, default='localhost')

# 通过parse_args()方法获取到option,args 分别赋给这2个变量
options, args = parser.parse_args()
#print("--arg:",options,args)
#print("-->",options.port)

# 如果指定了多个文件,会出现错误,这里定义了一次传一个文件
if len(args) != 1:
parser.error('Provide exactly one poetry file.')
poetry_file = args[0]

# 如果文件不存在,的错误异常
if not os.path.exists(args[0]):
parser.error('No such file: %s' % poetry_file)
# 返回脚本选项和要传输的文件路径
return options, poetry_file


# 定义Protocol (用于连接建立以后,如果对数据进行交互,以及连接的关闭)
class PoetryProtocol(Protocol): #handle
def connectionMade(self):
"""
当连接建立以后,直接发送文件,然后关闭连接
"""

self.transport.write(self.factory.poem)
self.transport.loseConnection()

# 集成了ServerFactory的factory 定义了协议对象的生成,另外为了让构造时能够获取到文件的句柄,重写了构造函数,
class PoetryFactory(ServerFactory): #基础类
protocol = PoetryProtocol
def __init__(self, poem):
self.poem = poem

# 主要运行程序,就相当于上面几个部分的组合
def main():
# 获取参数和文件路径
options, poetry_file = parse_args()
# 得到要传输的文件句柄
poem = open(poetry_file).read()
# 实例化factory类,由于重写了构造函数,把文件的句柄作为参数传入进去
factory = PoetryFactory(poem)
from twisted.internet import reactor
# 实例化监听对象,默认使用9000端口
port = reactor.listenTCP(options.port or 9000, factory,
interface=options.iface)
print 'Serving %s on %s.' % (poetry_file, port.getHost())
# 调用run方法
reactor.run()


if __name__ == '__main__':
main()

twisted 网络框架例子ECHO

twisted 网络框架例子:ECHO

服务器端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from twisted.internet import protocol
from twisted.internet import reactor

"""
定义一个事件ECHO类,这个类继承了protocol.Protocol,用于连接成功了以后,处理交互功能,数据的收发,连接的断开都是这个类控制
"""

class Echo(protocol.Protocol):
def dataReceived(self, data): #这个函数就是用于当收到数据以后才调用
self.transport.write(data) # 这里这个收到数据以后:支持把数据发回去,作为处理

"""
定义个运行的函数,
"""

def main():
factory = protocol.ServerFactory() #这是实例化factory,目的是在连接成功以后生成一个协议对象
factory.protocol = Echo #这里生成的协议对象就是前面我们定义的Echo

# reactor用来loop循环执行事件的处理,这里绑定了9000端口作为网络通信端口
reactor.listenTCP(9000,factory)
reactor.run()

if __name__ == '__main__':
main()

同步异步,阻塞和非阻塞以及select模块代码例子

同步,异步,阻塞和非阻塞
  1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
  2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(我有callback回调通知)
  3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
  4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过select通知调用者
    同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞!
    阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回!
    同步:提交请求->等待服务器处理->处理完毕返回这个期间客户端浏览器不能干任何事
    异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

python类继承

python中的类继承

当我们遇到有些情况是这样子的,有些对象既有相同的属性,又有不同的属性,这个时候没必要去吧在每个对象中把所有的属性都实现一边
而是说,先定义一个父类,然后子类继承父类的方法属性,如果有些属性特殊,可以重写,在python中经典类和新式类继承是不一样的
现在一般用新式类的继承方法也就是super(),super其实也是类,源码如下:

使用python的paramiko来实现批量主机管理

python第三方模块paramiko,很多人都知道fabric这个linux强大的主机批量管理工具,其实底层fabric就是用到了paramiko
这边我用paramiko来实现一个linux批量主机管理

功能描述
1. 可以分组批量执行远端命令,且要支持sudo,且捕获命令执行的退出符来判断命令执行是否成功还是失败,当然还有命令执行的时间
2. 可以put上传文件到服务器组,如果文件存在可以备份
3. 可以从远端服务器组下载文件
4. 多进程

python文件操作

python文件操作

Open方法

返回的是一个文件的句柄,一个file对象
open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True):
file: 代表文件的路径
mode: 是代表文件的操作模式 r w b + t 等等
buffering:0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小;
encoding: 指定返回的数据采用何种编码
errors: strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行
newline: 读取的时候->不指定newline默认开启Universal new line mode,其实就是相当于python2中rU模式,也就是文件无论是windows下的换行符”\r\n”还是linux下的”\n”都会被转换为”\n”
写入的时候->不指定newline会根据当前系统的默认换行符进行写入
closefd:默认是为True,参数中的file此时是传入文件的路径,如果设置成False那么只能接受fd

centos6 分区大于2TB

Centos 分区大于2T的方法

大于2TB需要使用GPT工具进行分区
命令式parted 如果没有这个命令 可以使用yum 进行安装

1
yum -y install parted

写成脚本

1
2
3
4
parted -s /dev/sd$i mklabel gpt
parted -s /dev/sd$i mkpart primary ext4 0% 100% #用这种方式可以解决4K对齐的问题
parted -s /dev/sd$i print
mkfs.ext4 -T largefile /dev/sd"$i"1 # -T largefile 参数可以快速操作,否则等很久

centos7 Tips

Centos7修改网卡名称(eth0)

在centos7中网卡名称是随机的一串非常的不友好,被称为”预测命名规则“,但我们还是希望eth0或者em1的 可以参考下面的方法

  1. vim /etc/sysconfig/network-scripts/ifcfg-enxxxxx 网卡配置文件,然后吧其中的name 和device 都改成eth0
  2. mv /etc/sysconfig/network-scripts/ifcfg-enxxxxx /etc/sysconfig/network-scripts/ifcfg-eth0
  3. 编辑/etc/default/grub 找到GRUBCMDLINELINUX在最后追加 net.ifnames=0 biosdevname=0
  4. 使用grub2-mkconfig -o /boot/grub2/grub.cfg 重新编辑grub配置文件和更新内核参数,重启生效
  5. 最好还是安装一下net-tools yum -y install net-tools 否则ifconfig 都没有

python迭代器,生成器

迭代器Iterator

迭代器是一种方法数组或者说集合的一种方式,也是一种对象,只有next方法,不能采用索引下标的方式方法,迭代一个集合数组不需要这个数据的所有元素都存在只有在用到的时候在存在即可

1
2
3
4
5
lst = range(10)
print(type(lst)) # 输出是 <type 'list'> 这是一个list
new_lst = iter(lst)
print(new_lst) # 输出是 <listiterator object at 0x107b1e510> 这个是迭代器的对象
new_lst.__next__() # 迭代器使用next()方法返回迭代器的下个值如果下一个没有值,就会出现一个StopIteration的异常

生成器generator

把一个返回迭代器的函数称之为生成器,python的函数一般是使用return 进行返回值,如果采用yield 那么这个函数就不是普通的函数了 这个函数成为生成器
而这个函数返回的就是一个迭代器。

1
2
3
def func():
print("Start")
yield 1

python中的函数

python中的函数

函数是个好东西,我觉得函数要比类用的更多,函数化编程从维护和开发中都带来了很多方便,函数就好比是模块,程序是由多个函数模块组装起来的乐高玩具

函数基本定义

python中定于函数使用def关键字,如下:

1
2
3
4
5
6
def func(argv):
"""
这是注释
"""

somecode
return something

其中func()就是一个函数,argv是函数的参数不是必须的,return 也不是必须的,没有return 就意味着函数只是执行,没有返回值是None
定义函数是不会执行函数的,上面我们只是定义了一个名为func的函数,并没有被执行,只有函数被调用的时候才会被执行