1 基于UDP套接字
1.1 介绍
  udp是无连接的,是数据报协议,先启动哪端都不会报错
  udp服务端

  1. import socket
  2.  
  3. sk = socket() #创建一个服务器的套接字
  4. sk.bind() #绑定服务器套接字
  5. while True: #服务器无限循环
  6. cs = sk.recvfrom()/sk.sendto() # 对话(接收与发送)
  7. sk.close() # 关闭服务器套接字

  udp客户端

  1. import socket
  2. client = socket() # 创建客户套接字
  3. while True: # 通讯循环
  4. client.sendto()/client.recvfrom() # 对话(发送/接收)
  5. client.close() # 关闭客户套接字

1.2 基本实例
1.2.1 服务端

  1. import socket
  2.  
  3. udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4. udp_server.bind(('127.0.0.1', 9999))
  5.  
  6. while True:
  7. data,client_addr = udp_server.recvfrom(512)
  8. print(data, client_addr)
  9. udp_server.sendto(data.upper(), client_addr)

1.2.2 客户端

  1. import socket
  2.  
  3. udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4.  
  5. while True:
  6. msg = input('>>').strip()
  7. udp_client.sendto(msg.encode('utf-8'), ('127.0.0.1',9999))
  8. data,server_addr = udp_client.recvfrom(512)
  9. print(data.decode('utf-8'))

1.3 udp不会粘包
  udp是基于数据报协议,发送一份信息,有完整的报头的主题,不会像tcp那样基于数据流的,没有开头、没有结尾;而udp有开头(报头),也有结尾,所以不会出现像tcp那样粘包现象。
1.3.1 服务端

  1. import socket
  2.  
  3. udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4. udp_server.bind(('127.0.0.1',9999))
  5.  
  6. info1,client_addr = udp_server.recvfrom(1)
  7. print('info1', info1)
  8. info2,client_addr = udp_server.recvfrom(512)
  9. print('info2', info2)

1.3.2 客户端

  1. import socket
  2.  
  3. udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4.  
  5. udp_client.sendto('welcome'.encode('utf-8'), ('127.0.0.1',9999))
  6. udp_client.sendto('beijing'.encode('utf-8'), ('127.0.0.1',9999))

1.4 udp并发
1.4.1 服务端

  1. import socketserver
  2. class MyUDPhandler(socketserver.BaseRequestHandler):
  3. def handle(self):
  4. print(self.request)
  5. self.request[1].sendto(self.request[0].upper(), self.client_address)
  6.  
  7. if __name__ == '__main__':
  8. udp_server = socketserver.ThreadingUDPServer(('127.0.0.1',8080), MyUDPhandler)
  9. udp_server.serve_forever()

1.4.2 客户端

  1. import socket
  2.  
  3. udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4.  
  5. while True:
  6. info = input('>>').strip()
  7. udp_client.sendto(info.encode('utf-8'), ('127.0.0.1',9999))
  8. body,server_addr = udp_client.recvfrom(512)
  9. print(body.decode('utf-8'))

2 进程
2.1 介绍
  进程:正在运行的一个过程或者任务,是对正在运行程序的一个抽象。

2.2 开启进程
示例1

  1. from multiprocessing import Process
  2. import time
  3. def my_run(info):
  4. print('task <%s> is running' %info)
  5. time.sleep(0.5)
  6. print('task <%s> is done' % info)
  7.  
  8. if __name__ == '__main__':
  9. process1 = Process(target = my_run, args=('mary',))
  10. process2 = Process(target = my_run, args=('jack',))
  11. process1.start()
  12. process2.start()

示例2

  1. from multiprocessing import Process
  2. import time
  3. class MyMulProcess(Process):
  4. def __init__(self,name):
  5. super().__init__()
  6. self.name = name
  7.  
  8. def my_run(self):
  9. print('task <%s> is runing' % self.name)
  10. time.sleep(0.5)
  11. print('task <%s> is done' % self.name)
  12.  
  13. if __name__ == '__main__':
  14. process = MyMulProcess('jack')
  15. process.my_run()
  16. process.start()

2.3 并发通信
2.3.1 服务端

  1. from multiprocessing import Pool
  2. import os
  3. import socket
  4. tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 解决Address already in use
  6. tcp_server.bind(('127.0.0.1',9999))
  7. tcp_server.listen(5)
  8. def work(conn, addr):
  9. print(os.getpid())
  10. print(addr)
  11. while True:
  12. try:
  13. data = conn.recv(1024)
  14. if not data:break
  15. conn.send(data.upper())
  16. except Exception:
  17. break
  18. conn.close()
  19.  
  20. if __name__ == '__main__':
  21. pool = Pool(4)
  22. while True:
  23. conn,addr = tcp_server.accept()
  24. pool.apply_async(work, args = (conn, addr))
  25. tcp_server.close()

2.3.2 客户端

  1. import socket
  2.  
  3. tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4. tcp_client.connect(('127.0.0.1',9999))
  5.  
  6. while True:
  7. info = input('>>').strip()
  8. if not info:continue
  9. tcp_client.send(info.encode('utf-8'))
  10. data = tcp_client.recv(1024)
  11. print(data.decode('utf-8'))
  12.  
  13. tcp_client.close()

2.4 join方法
  主进程,等待子进程运行完,才执行下面内容;
  p.join只能join住start开启的进程,而不能join住run开启的进程
  主进程,等待p1执行结束,才执行主进程下面的内容

  1. from multiprocessing import Process
  2. import time
  3.  
  4. def work(name):
  5. print('task <%s> is runing' %name)
  6. time.sleep(0.5)
  7. print('task <%s> is done' % name)
  8.  
  9. if __name__ == '__main__':
  10. process1 = Process(target = work, args=('jack',))
  11. process2 = Process(target = work, args=('mary',))
  12.  
  13. process_list = [process1, process2]
  14. for process in process_list:
  15. process.start()
  16.  
  17. for process in process_list:
  18. process.join()

2.6 守护进程
  主进程代码运行完毕,守护进程就会结束
  主进程创建守护进程
  1.守护进程会在主进程代码执行结束后就终止
  2.守护进程内无法再开启子进程,否则抛出异常。

  守护进程,守护者主进程,主进程结束,守护进程随即结束;主进程代码结束后,守护进程随之结束

  1. from multiprocessing import Process
  2. import time
  3. def work(name):
  4. print('task <%s> is runing' %name)
  5. time.sleep(0.5)
  6. print('task <%s> is done' % name)
  7.  
  8. if __name__ == '__main__':
  9. p1=Process(target=work,args=('jack',))
  10. p1.daemon = True # 必须在进程开启之前,设置为守护进程
  11. p1.start()

  重复守护进程概念,守护进程什么时间结束;在主进程代码结束,就会结束

  1. from multiprocessing import Process
  2. import time
  3. def foo():
  4. print("from foo start")
  5. time.sleep(0.5)
  6. print("from foo end")
  7.  
  8. def bar():
  9. print("from bar start")
  10. time.sleep(0.8)
  11. print("from bar end")
  12. if __name__ == '__main__':
  13. process1 = Process(target = foo)
  14. process2 = Process(target = bar)
  15.  
  16. process1.daemon = True
  17. process1.start()
  18. process2.start()
  19. print("主进程")
  20.  
  21. #打印该行则主进程代码结束,则守护进程process1应该被终止,
  22. # 可能会有process1任务执行的打印信息from foo start,
  23. # 因为主进程打印主进程时,process1也执行了,但是随即被终止

2.7 进程同步锁
  核心点:保证一个进程用完一个终端,再交个另一个终端使用,独享终端,保证有序;

2.7.1 基本用法
  加锁,变为串行,保证数据不会错乱;效率与错乱之间做出取舍

  1. from multiprocessing import Process,Lock
  2. import time
  3. def work(name, mutex):
  4. mutex.acquire()
  5. print('task <%s> is runing' %name)
  6. time.sleep(0.5)
  7. print('task <%s> is done' % name)
  8. mutex.release()
  9.  
  10. if __name__ == '__main__':
  11. mutex = Lock()
  12. process1 = Process(target = work, args = ('jack', mutex))
  13. process2 = Process(target = work, args = ('mary', mutex))
  14. process1.start()
  15. process2.start()

2.7.2 模拟购票
  模拟购票,查询票的余额,不要考虑先后顺序;而到真正购票环境,需要保证一张票不被多次购买,需要加锁。

  1. import json,time,os
  2. from multiprocessing import Process,Lock
  3. def search():
  4. dic = json.load(open('ticket.txt'))
  5. print('\033[32m[%s] 看到剩余票数<%s>\033[0m' %(os.getpid(), dic['count']))
  6. def get_ticket():
  7. dic = json.load(open('ticket.txt'))
  8. time.sleep(0.5) # 模拟读数据库的网络延迟
  9. if dic['count'] > 0:
  10. dic['count'] -= 1
  11. time.sleep(0.5) # 模拟写数据库的网络延迟
  12. json.dump(dic,open('ticket.txt','w'))
  13. print('\033[31m%s 购票成功\033[0m' %os.getpid())
  14. def work(mutex):
  15. search()
  16. mutex.acquire()
  17. get_ticket()
  18. mutex.release()
  19. if __name__ == '__main__':
  20. mutex = Lock()
  21. for index in range(10):
  22. process = Process(target = work, args = (mutex,))
  23. process.start()

2.7.3 共享数据通信
  基于共享内存方式,进行数据通信,需要考虑锁的形式。

  1. from multiprocessing import Process,Manager,Lock
  2.  
  3. def work(dic, mutex):
  4. with mutex:
  5. dic['count'] -= 1
  6.  
  7. if __name__ == '__main__':
  8. mutex = Lock()
  9. manager = Manager()
  10. dic = manager.dict({'count':100})
  11. p_list = []
  12. for i in range(100):
  13. process = Process(target = work, args = (dic, mutex))
  14. p_list.append(process)
  15. process.start()
  16.  
  17. for process in p_list:
  18. process.join()
  19. print(dic)

2.7.3 进程间通信
  进程间的通信,有很多方式,例如:管道、共享数据、消息队列等;推荐的方式是:通过消息队列的方式进行通信。
  Queue,常用方法:put、get;队列就是管道加锁,进行实现的

  1. from multiprocessing import Queue
  2.  
  3. queue = Queue(3) # 队列的最大长度为3
  4.  
  5. queue.put('first')
  6. queue.put('second')
  7. queue.put('third')
  8. queue.put('fourth') # 超过队列长度,满了会卡着
  9.  
  10. print(queue.get())
  11. print(queue.get())
  12. print(queue.get())
  13. print(queue.get()) # 队列空了,一直卡着,等待队里有值,进行获取
  14.  
  15. # 了解知识点
  16. queue = Queue(3)
  17. queue.put('first',block = False) # 队列满了,不进行锁住,会抛异常
  18. queue.put('second', block = False)
  19. queue.put('third', block = False)
  20. queue.put_nowait('fourth') # 等价queue.put('fourth', block = False)
  21. queue.put('fourth',timeout = 3) # 默认等待3秒钟,指定超时时间

3 生产者、消费者
  应该具有两类模型,生产者和消费者
3.1 基本版本的生产者消费者

  1. from multiprocessing import Process,Queue
  2. import time,os
  3. def producer(q,name):
  4. for i in range(5):
  5. time.sleep(0.5)
  6. res='%s%s' %(name,i)
  7. q.put(res)
  8. print('\033[42m<%s> 制造 [%s]\033[0m' %(os.getpid(),res))
  9.  
  10. def consumer(q):
  11. while True:
  12. res=q.get()
  13. if res is None:break
  14. time.sleep(0.8)
  15. print('\033[31m<%s> 购买 [%s]\033[0m' % (os.getpid(), res))
  16.  
  17. if __name__ == '__main__':
  18. queue = Queue()
  19. # 生产者
  20. producer1 = Process(target = producer, args = (queue, '自行车'))
  21. producer2 = Process(target = producer, args = (queue, '汽车'))
  22. producer3 = Process(target = producer, args = (queue, '飞机'))
  23.  
  24. # 消费者
  25. consumer1 = Process(target = consumer, args = (queue,))
  26. consumer2 = Process(target = consumer, args = (queue,))
  27.  
  28. producer1.start()
  29. producer2.start()
  30. producer3.start()
  31. consumer1.start()
  32. consumer2.start()
  33.  
  34. producer1.join()
  35. producer2.join()
  36. producer3.join()
  37. queue.put(None) # 利用None通知消费者,东西已经生产完了
  38. queue.put(None) # 有几个消费者,就要通知几次

3.2 JoinableQueue改进生产者消费者模型
  生产者等待消费者把队列的内容全部去空,就结束生产过程;消费等待主进程结束,也就随之结束
  主进程等待生产者结束,才执行剩余代码;需要消费者利用守护进程,随者主进程结束也就结束。
  逻辑性比较强,利用JoinableQueue和守护进程和join。

  1. from multiprocessing import Process,JoinableQueue
  2. import time,os
  3. def producer(queue, name):
  4. for i in range(5):
  5. time.sleep(0.5)
  6. res = '%s%s' %(name,i)
  7. queue.put(res)
  8. print('\033[42m<%s> 制造 [%s]\033[0m' %(os.getpid(),res))
  9. queue.join() # 生产者等待queue里面的所有内容都被卖掉了,就结束了
  10.  
  11. def consumer(queue):
  12. while True:
  13. res = queue.get()
  14. if res is None:break
  15. time.sleep(0.8)
  16. print('\033[31m<%s> 购买 [%s]\033[0m' % (os.getpid(), res))
  17. queue.task_done() # 确定购买了生产者的一个内容,通知生产者
  18. # 通知queue,已经取走一个东西
  19.  
  20. if __name__ == '__main__':
  21. queue = JoinableQueue()
  22. # 生产者
  23. producer1 = Process(target = producer, args = (queue, '自行车'))
  24. producer2 = Process(target = producer, args = (queue, '汽车'))
  25. producer3 = Process(target = producer, args = (queue, '飞机'))
  26.  
  27. # 消费者
  28. consumer1 = Process(target = consumer, args = (queue,))
  29. consumer2 = Process(target = consumer, args = (queue,))
  30.  
  31. consumer1.daemon = True # 消费者利用守护进程,随着主进程结束也就结束
  32. consumer2.daemon = True
  33. producer1.start()
  34. producer2.start()
  35. producer3.start()
  36. consumer1.start()
  37. consumer2.start()
  38.  
  39. producer1.join()

4 进程池
  默认开启进程池的个数,是cpu核数的个数
4.1 同步提交任务
  同步提交任务,损失效率,保证数据有序和安全

  1. from multiprocessing import Pool
  2. import os,time
  3.  
  4. def task(n):
  5. print('task <%s> is runing' %os.getpid())
  6. time.sleep(0.5)
  7. return n**3
  8.  
  9. if __name__ == '__main__':
  10. print(os.cpu_count())
  11. p = Pool(4)
  12. for index in range(10):
  13. res = p.apply(task, args = (index,))
  14. print(res)

4.2 异步提交任务
  等待进程池中的所有任务结束,就可以拿到运行结果
  p.close(),禁止向进程池中提交新任务

  1. from multiprocessing import Pool
  2. import os,time
  3.  
  4. def task(n):
  5. print('task <%s> is runing' %os.getpid())
  6. time.sleep(0.5)
  7. return n**3
  8.  
  9. if __name__ == '__main__':
  10. print(os.cpu_count())
  11. pool = Pool(4)
  12. res_list = []
  13. for index in range(10):
  14. res = pool.apply_async(task, args = (index,)) # 只负责向队列仍任务,不等任务结束
  15. res_list.append(res)
  16.  
  17. for res in res_list:
  18. print(res.get())
  19.  
  20. pool.close()
  21. pool.join()

4.3 进程池控制并发
  利用进程池,控制并发的进程数量
4.3.1 服务端

  1. from multiprocessing import Pool
  2. import os
  3. import socket
  4.  
  5. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  7. server.bind(('127.0.0.1',9999))
  8. server.listen(5)
  9. def work(conn, addr):
  10. print(os.getpid())
  11. print(addr)
  12. while True:
  13. try:
  14. data=conn.recv(1024)
  15. if not data:break
  16. conn.send(data.upper())
  17. except Exception:
  18. break
  19. conn.close()
  20.  
  21. if __name__ == '__main__':
  22. pool = Pool(4)
  23. while True:
  24. conn,addr = server.accept()
  25. pool.apply_async(work, args = (conn, addr))
  26. server.close()

4.3.2 客户端

  1. import socket
  2. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. client.connect(('127.0.0.1',9999))
  4.  
  5. while True:
  6. info = input('>>').strip()
  7. if not info:continue
  8. client.send(info.encode('utf-8'))
  9. data = client.recv(1024)
  10. print(data.decode('utf-8'))
  11.  
  12. client.close()

4.4 回调函数
  让下载的函数进行并发,解析的函数进行串行执行(利用回调函数进行执行)
  耗时时间长的利用进程池进行并发处理,利用异步进行处理

  1. import requests # pip3 install requests
  2. import os,time
  3. from multiprocessing import Pool
  4. def get_info(url):
  5. print('<%s> get :%s' %(os.getpid(),url))
  6. respone = requests.get(url)
  7. if respone.status_code == 200:
  8. return {'url':url, 'text':respone.text}
  9.  
  10. def parse_page(dic):
  11. print('<%s> parse :%s' %(os.getpid(),dic['url']))
  12. time.sleep(0.5)
  13. parse_res='url:<%s> size:[%s]\n' %(dic['url'],len(dic['text'])) # 模拟解析网页内容
  14. with open('reptile.txt','a') as f:
  15. f.write(parse_res)
  16.  
  17. if __name__ == '__main__':
  18. pool = Pool(4)
  19. urls = [
  20. 'https://www.baidu.com',
  21. 'https://www.python.org',
  22. 'https://www.openstack.org',
  23. 'https://help.github.com',
  24. 'https://www.sina.com.cn',
  25. ]
  26.  
  27. for url in urls:
  28. pool.apply_async(get_info, args = (url,), callback = parse_page)
  29. # 利用回调函数,通知主进程,调用parse_page,需要执行parse_page函数了
  30. # 把get_page执行结果,传递给parse_page作为参数进行传递
  31.  
  32. pool.close()
  33. pool.join()

5 paramike模块
5.1 介绍
  paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。

5.2 基于密码连接

  1. import paramiko
  2.  
  3. # 创建SSH对象
  4. ssh = paramiko.SSHClient()
  5. # 允许连接不在know_hosts文件中的主机
  6. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  7. # 连接服务器
  8. ssh.connect(hostname='127.0.0.1', port=22, username='root', password='xxx')
  9.  
  10. # 执行命令
  11. stdin, stdout, stderr = ssh.exec_command('df')
  12. # 获取命令结果
  13. result = stdout.read()
  14. print(result.decode('utf-8'))
  15. # 关闭连接
  16. ssh.close()

5.3 基于秘钥链接
  客户端文件名:id_rsa
  服务端必须有文件名:authorized_keys(在用ssh-keygen时,必须制作一个authorized_keys,可以用ssh-copy-id来制作)

  1. import paramiko
  2.  
  3. private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
  4.  
  5. # 创建SSH对象
  6. ssh = paramiko.SSHClient()
  7. # 允许连接不在know_hosts文件中的主机
  8. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  9. # 连接服务器
  10. ssh.connect(hostname='127.0.0.1', port=22, username='root', pkey=private_key)
  11.  
  12. # 执行命令
  13. stdin, stdout, stderr = ssh.exec_command('df -h')
  14. # 获取命令结果h
  15. result = stdout.read()
  16. print(result.decode('utf-8'))
  17. # 关闭连接
  18. ssh.close()
  1. import paramiko
  2. from io import StringIO
  3. key_str = """-----BEGIN RSA PRIVATE KEY-----
  4. MIIEpQIBAAKCAQEAl6OGU27q3YV1LMdAZH02PWFtPJaxQ68zbWIBmgP0NfnVQz30
  5. Bvhe+rZCFEQCwLoeld4jj7vA+Vk8nKPoBhX1WVvq9MfSF+YRXeu1+XAXvL1pH+Q9
  6. 6gJ1l4NmwHq8DVgUCx3TsAdK0wOqEIUDSOu+2/nECK1lmKN1Cf5Va20r+B0CDjkT
  7. RRA6C9MIb2WWwf4EiEWjBl+lnZ0vDXoB38oZQR71tdLsvrVumUDzyGvF79jWW3O6
  8. 9gc4F2ivoKVbXswyJfq1bVpH1N7aM6DzUiELv1mFsyIVveydMVzFIrDbUI8gCErx
  9. NhI6esUbhNwfd3NfBOTzEQxBd5V3/a6rkC5MpwIDAQABAoIBAQCD9cJHiRbKgAFg
  10. XmUjDfPNpqMxPtI0XJscbVWHejljX26/fYKHLk05ULJggG8E2PMU6KN5yaI9W/Lr
  11. PZgE88b3ZI4rRlkGgyhJ234Y+/ssPIjnP/DBXDKJD8izaBuOYT/QDLzTSwVKbL3q
  12. clZRdxY4yDpYcs0e7+BCOhqLyg2hdAYA8Z4VOOs4SQqRW6k9K+oXeNMhc4htozOf
  13. tVsSM3XkFZ4hpug34S89+FKEwZ00RTJEEkK8IjBfLJ5w+RfLFXth8hTVMbeLhcv+
  14. RqDYdUwq/JAXCrri0687hCwi5J06xTrY7BwgoKJznxlpz6tiyEPNrnqZ1vAayWqS
  15. G/x+R/cBAoGBAMj49kKmEpKZesbbSD9KJvD1YnkIGwEheLvNZzRtx+2cwejHHWDZ
  16. F0i+KzDTt+7QZ2zb+ABOgK1sq8Xhfn40M90xqixbqp0UzaFyMFnmiB2iyZ56I3Fi
  17. Kqeerr+f3i/djewNhMJZZZhO/n+YxhCpQUBotepQ3tGA/G6vvkSSMe73AoGBAMEo
  18. i9LaSDyJxk51mW8OmgiIyJ1376LKu3sHlUkn+Ca5dm2/iYNIuN5dC0YTPjo1A5It
  19. jZTid5VBEb4OMOpKYygR4S9euAxv22Uxib1xGZLdJHKblwizdJnBazsqDQW6mPfN
  20. o/BADQl/+h3pPpOWoIxSxi07xYq+gAToW2tc6TPRAoGBAKhGHRwtJbvuGqlKjjHA
  21. Ct8S94LT0JifyBGnqNRzX0WLTal0nxqqax6TbGKTw5yIjzDM9dh74q5TIXismFdf
  22. qlV48j31+uNPueWGUQnVRv9ZgGvbZLXZNlHnQfZdC5MUdXLC1vhMFg7zhZCdAKqO
  23. rX4arsclM4xD7hlXuX580qZ9AoGALs5te43LnWfhdxfGM4Q9TT4gJxBuMGuiHMEM
  24. quqVloSwrw2P/BE+QxwW5Ec7eA1qrRx+x4pNYgyfiQeVUODvwED86WaxgMoGRzJG
  25. 53IluVH/SApuAfzCj5OwMWkSOMYr1TiutkQ/JIMvj9n6gPcqNnbEcSefyew5x3aq
  26. 2IxuMlECgYEAtVuORz9C7WnJIVW6HwNiS4OBs7becOgXDHAOw0hnu+3mxVm/NIkX
  27. yeGK7rP1KKbS4I3pbG+H0nWAQkfQtW6nQjU5nvoCTX8Yyk6ZNC0mhGNTqKRqpjI/
  28. eXe8nUib71izC6g6kJY66+BTg2SCBsHUAqAB7L4gvFHGt8sq46TQ3jw=
  29. -----END RSA PRIVATE KEY-----"""
  30.  
  31. private_key = paramiko.RSAKey(file_obj=StringIO(key_str))
  32. transport = paramiko.Transport(('127.0.0.1', 22))
  33. transport.connect(username='root', pkey=private_key)
  34.  
  35. ssh = paramiko.SSHClient()
  36. ssh._transport = transport
  37.  
  38. stdin, stdout, stderr = ssh.exec_command('df')
  39. result = stdout.read()
  40. print(result.decode('utf-8'))
  41. transport.close()
  42.  
  43. print(result)

python基础-UDP、进程、进程池、paramike模块的更多相关文章

  1. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

  2. Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块

    进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...

  3. Python基础—线程、进程和协程

    今天已是学习Python的第十一天,来干一碗鸡汤继续今天的内容,今天的鸡汤是:超越别人对你的期望.本篇博客主要介绍以下几点内容: 线程的基本使用: 线程的锁机制: 生产者消费之模型(队列): 如何自定 ...

  4. python基础-第六篇-6.2模块

    python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ ...

  5. python基础之面向过程编程,模块

    面向过程编程 面向过程的核心是过程,指的是解决问题的步骤,即先干什么再干什么,就好像设计一条流水线. 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 ...

  6. Python菜鸟之路:Python基础-线程、进程、协程

    上节内容,简单的介绍了线程和进程,并且介绍了Python中的GIL机制.本节详细介绍线程.进程以及协程的概念及实现. 线程 基本使用 方法1: 创建一个threading.Thread对象,在它的初始 ...

  7. Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁

    本节内容: 进程与线程区别 线程 a)  语法 b)  join c)  线程锁之Lock\Rlock\信号量 d)  将线程变为守护进程 e)  Event事件 f)   queue队列 g)  生 ...

  8. python基础--线程、进程

    并发编程: 操作系统:(基于单核研究) 多道技术: 1.空间上的复用 多个程序共用一个计算机 2.时间上的复用 切换+保存状态 例如:洗衣 烧水 做饭 切换: 1.程序遇到IO操作系统会立刻剥夺着CP ...

  9. python基础之小数据池、代码块、编码和字节之间换算

    一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽 ...

随机推荐

  1. java注解 @SuppressWarnings注解用法

    @SuppressWarnings注解用法 @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码工具左侧行列提示,但这种警告可以通过注释类型声明来取消 @SuppressWar ...

  2. Javascript中与Scroll有关的方法

    这块确实太乱了,被兼容搞的简直快要晕死,默默地总结下... 与scroll相关的方法 4个window对象下:scrollX.scrollY.scrollTo.scroll(作用和scrollTo一样 ...

  3. CS229 笔记04

    CS229 笔记04 Logistic Regression Newton's Method 根据之前的讨论,在Logistic Regression中的一些符号有: \[ \begin{eqnarr ...

  4. laravel一个页面两个表格分页处理

    关键是看懂laravel自带的 paginate() 方法. 在Builder.php文件(项目名称/laravel/vendor/laravel/framework/src/Illuminate/D ...

  5. 关联查询resultMap使用规则总结——(十一)

    resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用re ...

  6. mongoexport导出csv中文乱码

    在用mongoexport导出csv文件时,发现数据库中的中文在excel中都显示为乱码,用notepad打开则正常. 解决办法: 在notepad中,将编码格式改为UTF-8,保存,再用excel打 ...

  7. 【干货】已Window7 系统为例,谈谈boot引导程序-------附带看看数据隐藏

    来源:Unit 3: Unix/Linux File System 3.1 Unix/Linux File System Booting Process 使用工具:EnCase Forensic 学习 ...

  8. Linux TTY驱动--Serial Core层【转】

    转自:http://blog.csdn.net/sharecode/article/details/9197567 版权声明:本文为博主原创文章,未经博主允许不得转载. 接上一节: Linux TTY ...

  9. 【坐在马桶上看算法】算法6:只有五行的Floyd最短路算法

            暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

  10. Robotium_断言方法assert、is、search

    下面的这些方法都主要用来判断测试结果是否与预期结果相符,一般把is和search方法放在assert里面判断.assert最常用的还是assertThat方法,是Junit的判断,这里就不多说了.断言 ...