<--目录-->
1、Socket传文件
2、多线程
3、paramiko
1、Socket传文件
Socket服务端 cat server.py #!/usr/bin/env python #coding:utf-8 import SocketServer import os class MyServer(SocketServer.BaseRequestHandler): def handle(self): base_path = 'g:/index' #存放接收文件的路径,index文件夹必须事先存在 conn = self.request#收到客户端的请求连接 print 'connected...'#输出连接,代表客户端已跟我建立连接 while True:#死循环 pre_data = conn.recv(1024)#每次接收数据1024,收到客户端发送的请求方法、文件名、文件大小的数据 cmd,file_name,file_size = pre_data.split('|') #获取请求方法、文件名、文件大小 recv_size = 0 #已经接收文件的大小,先定义为0 file_dir = os.path.join(base_path,file_name) #上传文件路径拼接,即我本地的文件夹路径拼客户端的文件名 f = file(file_dir,'wb') #对上传的文件有可写权限 Flag = True while Flag: #死循环 if int(file_size)>recv_size:#未上传完毕,即客户端传过来给我的文件大小大于我接收到的文件大小 data = conn.recv(1024)#最多接收1024,可能接收的小于1024,接收数据 recv_size+=len(data) #将接收的数据加入recv_size else:#上传完毕,则退出循环 recv_size = 0再次将recv_size定义为0,进行下一次文件的传送接收 Flag = False#定义Flag为False则不再则行死循环 continue#跳出本次循环 f.write(data)#将接收到的数据写入文件 print 'upload successed.'#输出上传成功 f.close()`#关闭文件 instance = SocketServer.ThreadingTCPServer(('127.0.0.1',9999),MyServer) #异步多线程 instance.serve_forever()
Socket客户端
cat client.py #!/usr/bin/env python #coding:utf-8 import socket import sys import os ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.connect(ip_port) while True: input = raw_input('path:') #输入路径 cmd,path = input.split('|') #前面上传命令,随便写,|后面是本地文件路径 如put|g:/test.txt file_name = os.path.basename(path) #获取文件名字,如test.txt file_size=os.stat(path).st_size #获取文件大小 sk.send(cmd+"|"+file_name+'|'+str(file_size)) #发送 "上传命令" | "文件名" | "文件大小" send_size = 0 #定义发送大小刚开始等于0 f= file(path,'rb') #打开文件 Flag = True while Flag: #死循环 if send_size + 1024 >file_size: #如果发送大小再加+1024则行下面语句,每次发送只能是1024 data = f.read(file_size-send_size) #总文件大小减去-已发送大小=还没发送大小 Flag = False else: #否则 data = f.read(1024) #读文件1024的数据,然后赋值给data send_size+=1024 #然后发送了的大小每次累加1024 sk.send(data) #发送读的1024的数据 f.close() #关闭文件 sk.close() #关闭socket
2、多线程开发
start 线程准备就绪,等待CPU调度
setName 为线程设置名称
getName 获取线程名称
setDaemon 设置为后台线程或前台线程(默认)
如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义
run 线程被cpu调度后自动执行线程对象的run方法
- thred_demo 包
-index.py 模块文件
1)创建线程,执行线程,守护模式
cat index.py #!/usr/bin/env python #coding:utf-8 from threading import Thread import time def Foo(arg,v): for item in range(100): print item time.sleep(1) print 'before' t1 = Thread(target=Foo,args=('abc',1,)) #与函数建立关系,创建线程 t1.setDaemon(True) #守护模式,只执行主线程,如果主线程一直没有结束,子线程会执行,什么时候主线程结束了,子线程才会跟着一起销毁 t1.start() #执行线程 print #print t1.isDaemon #子线程执行完了,主线程才中断,这个很少用 print t1.getName() #输出线程名字 print 'after' print 'after' print 'after' print 'after end' time.sleep(3)
2)join练习
#!/usr/bin/env python #coding:utf-8 from threading import Thread import time def Foo(arg,v): for item in range(100): print item time.sleep(1) print 'before' t1 = Thread(target=Foo,args=('abc',1,)) #与函数建立关系 #t1.setDaemon(True) #守护模式,只执行主线程,主线程执行结束了,子线程也会跟着销毁 t1.start() #执行线程 t1.join(5) #只执行到Join这里,下面的内容主线程不再执行,只执行子线程的,最多给你五秒时间,超时则执行下面主线程的内容 print print t1.getName() #输出线程名字 print 'after' print 'after' print 'after' print 'after end' time.sleep(10)
3)自定义线程类,run()练习示例
from threading import Thread import time class MyThread(Thread): #继承Thread def run(self): #time.sleep(10) print '我是线程' Thread.run(self) #调用父类的run方法 ,如果没有这句,则不会执行下面函数的print 'bar' def Bar(): print 'bar' t1 = MyThread(target=Bar) t1.start() print 'over'
4)面向对象实现生产者消费者模型
cat producter_demo.py #!/usr/bin/env python #coding:utf-8 from threading import Thread from Queue import Queue import time class Procuder(Thread): def __init__(self,name,queue): ''' @param name:生产者的名称 @param queue:容器 ''' self.__Name = name self.__Queue = queue super(Procuder,self).__init__() #调用父类的构造函数 def run(self): while True: if self.__Queue.full(): #包子满了 time.sleep(1) else: self.__Queue.put('baozi') time.sleep(1) print '%s 生产了一个包子' %(self.__Name,) #Thread.run(self) class Consumer(Thread): def __init__(self,name,queue): ''' @param name:生产者的名称 @param queue:容器 ''' self.__Name = name self.__Queue = queue super(Consumer,self).__init__() #调用父类的构造函数 def run(self): while True: if self.__Queue.empty(): #没有包子了则休息一秒 time.sleep(1) else: self.__Queue.get('baozi') time.sleep(1) print '%s 消费了一个包子' %(self.__Name,) #Thread.run(self) que = Queue(maxsize=100) #创建一个队列,空间大小一百,放包子 baogou1 = Procuder('老王1',que) baogou1.start() baogou2 = Procuder('老王2',que) baogou2.start() baogou3 = Procuder('老王3',que) baogou3.start() for item in range(20): name = 'chentao%d' %(item,) temp = Consumer(name,que) temp.start() ''' print que.qsize() #查看占用的数据大小为0 que.put('1') #往里面存放数据 que.put('2') #往里面存放数据 print 'empty:',que.empty() #查看是为空,不为空就是有数据也就是False print que.qsize() #查看占用的数据大小为2 print 'get:',que.get() #取数据1 print 'get:',que.get() #取数据2,取到没有了就不会再取了 print 'empty:',que.empty() #为空没数据为就是True '''
5)函数式编程实现生产者消费者模型
cat consumer_producer.py #!/usr/bin/env python #coding:utf-8 import threading import time import Queue import random def Proudcer(name,que): while True: if que.qsize() < 3: que.put('baozi') print '%s:生产一个包子===========================' %name #生产一个包子 time.sleep(random.randrange(4)) #随机睡眠N秒后再生产包子 else: print U'还有大于或等于3个包子' def Consumer(name,que): while True: try: que.get_nowait() #取得一个包子,默认先生产的就先取得,如果没有包子,就会报错 except Exception: print U'没有包子了。。。' else: print '%s:买一个包子' %name time.sleep(random.randrange(3)) #随机睡眠N秒后再买包子 q = Queue.Queue() #定义容器,没定义大小就是无限大 p1 = threading.Thread(target=Proudcer,args=['zhang1',q]) p2 = threading.Thread(target=Proudcer,args=['zhang2',q]) p1.start() p2.start() c1 = threading.Thread(target=Consumer,args=['xie1',q]) c2 = threading.Thread(target=Consumer,args=['xie2',q]) c1.start() c2.start()
进程和线程的区别?
1、进程可以理解为一个应用程序在处理机上的一次执行过程,一个进程包含多个线程
2、进程间相互独立,同一进程的各线程间共享内存,某线程内的线程在其它进程不可见
3、进程不可以共享内存,进程产生子进程,并且子进程继承了对应的父进程的大部分属性
多线程开发之线程锁( threading.Lock() ),一把锁
#!/usr/bin/env python #coding:utf-8 import threading import time num = 0 def run(n): time.sleep(1) global num #加上global可以在局部变量改全局变量的值 lock.acquire() #加上锁,单线程执行 num +=1 lock.release() #解锁,加锁了就要解锁 print '%s\n' %num lock = threading.Lock() for i in range(100): t = threading.Thread(target=run,args=(i,)) t.start()
#多把锁实战( threading.RLock() )
#!/usr/bin/env python #coding:utf-8 import threading import time num = 0 num2 = 0 def run(n): time.sleep(1) global num #加上global可以在局部变量改全局变量的值 global num2 lock.acquire() #加上锁,单线程执行 num += 1 lock.acquire() num2 += 2 lock.release() lock.release() #解锁,加锁了就要解锁 time.sleep(0.01) print '%s\n' %num lock = threading.RLock() for i in range(200): t = threading.Thread(target=run,args=(i,)) t.start()
设置允许最大连接数、线程数
#!/usr/bin/env python #coding:utf-8 import threading import time num = 0 def run(n): time.sleep(1) global num #加上global可以在局部变量改全局变量的值 samp.acquire() #加上锁,4线程同时执行 num += 1 print '%s' %num samp.release() #解锁 samp = threading.BoundedSemaphore(4) #最大连接数,也就是同时运行的线程数 for i in range(200): t = threading.Thread(target=run,args=(i,)) t.start()
多线程开发之事件(通过信号来做数据交互)
#!/usr/bin/env python #coding:utf-8 import threading import time def producer(): print u'老蔡:等人来买包子。。。' event.wait() #等待对方的事件 event.clear() #清空事件,把True变为False print u"老蔡:你是要来买包子吗" print u"老蔡:包子就快做好了" time.sleep(5) print u'老蔡:你的包子做好了' event.set() #设置事件,变为True def consumer(): print u'老王:去买包子。。。' event.set() #用来设置事件告知对方 time.sleep(2) print u"老王:等你的包子做好呀" while True: if event.isSet(): #用来检测事件变量是否设置,该函数返回的是否布尔值,即true/false print u"老王:Thanks..." break else: print u"还没做好吗" time.sleep(1) event = threading.Event() p = threading.Thread(target=producer) c = threading.Thread(target=consumer) p.start() c.start()
paramiko详解(第三方模块需要下载)
下载安装
pycrypto-2.6.1.tar.gz
paramiko-1.10.1.tar.gz
yum install gcc python-devel
1、下载安装 pycrypto-2.6.1.tar.gz
解压,进入,python setup.py build【编译】,python setup.py install 【安装】 ----》import Crypto
2、下载安装 paramiko-1.10.1.tar.gz
解压,进入,python setup.py build【编译】,python setup.py install 【安装】---》 import paramiko
#基于密码连接
[root@test1 opt]# cat ssh.py #!/usr/bin/env python #coding:utf-8 import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机,平常连接会要你输入YES,有了这句话直接允许不用输入YES ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.200.11', port=22, username='root', password='hengtai') # 执行命令,stdin是输入命令,stdout是输出的结果,stderr是指输出的报错,三个都要写上去,否则执行会报错 stdin,stdout,stderr = ssh.exec_command('df -h') # 获取命令结果 result_out = stdout.read() result_err = stderr.read() print result_out print result_err # 关闭连接 ssh.close()
#基于密钥连接
[root@test1 opt]# cat skey.py #!/usr/bin/env python #coding:utf-8 import paramiko private_key_path = '/root/.ssh/id_rsa' #输入Key的路径 key = paramiko.RSAKey.from_private_key_file(private_key_path) #获得key ssh = paramiko.SSHClient() #获取连接ssh方法 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #获允许连接不在know_hosts文件中的主机 ssh.connect(hostname='192.168.200.11', port=22, username='root', pkey=key) #连接相关信息 stdin, stdout, stderr = ssh.exec_command('ifconfig') #执行命令 print stdout.read() #输出命令 ssh.close(); #关闭