第九篇:进程与线程

一、paramiko模块

二、ssh登录过程和上传下载

三、进程和线程简绍

四、多线程、多线程实例

五、守护线程

六、线程锁

七、递归锁

八、信号量

九、线程间通信event

十、queue消息队列

十一、进程Queue数据传递

十二、pipe 管道通信

十三、进程池和回调函数

 

1.paramiko模块
执行命令
import paramiko #导入模块
ssh = paramiko.SSHClient() #创建实例
ssh.connect(hostname='localhost', #建立连接
port=22,
username='test',
password='123456')
stdin, stdout, stderr = ssh.exec_command('df') #执行命令
res,err = stdout.read(),stderr.read() #获取结果
result = res if res else err
print(result.decode())
ssh.close() #关闭连接

传输文件
import paramiko
transport = paramiko.Transport('hostname',22)
transport.connect(username='test',password='123456')
sftp = paramiko.SFTPClient.from_transport(transport)
#将本地文件传到远程
sftp.put('/tmp/location.py','/tmp/test.py')
#将远程文件下载到本地
sftp.get('remove_path','local_path')
transport.close()
2.ssh登录过程
known_hosts文件,第一次连接需要yes确认;
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 自动添加;
RSA --非对称秘钥验证
公钥--public key
私钥--private key
localhost --------> server
私钥 公钥
生成秘钥 ssh-keygen
秘钥登录:
指定秘钥位置
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
password改为key
(username='test',pkey = private)
3.线程和进程
线程是操作系统能够调度的最小单位;一堆指令;被包含在进程中,是进程中的
实际运作单位
每一个程序的内存是独立的;
一个程序要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用;
进程要操作CPU,必须要先创建一个线程;
所有在同一个进程里的线程是共享同一块内存空间;
启动一个线程比启动一个进程快;
两个进程间通信,必须通过一个中间代理来实现;
创建新线程很简单,创建新进程需要对其父进程进行一次克隆;
一个线程可以控制和操作同一个进程里的其他线程,但是进程只能操作子进程;
4.多线程间实例
import threading
def run(n):
print("task",n)
time.sleep(2)

t1 = threading.Thread(target=run,args=("t1",))
t2 = threading.Thread(target=run,args=("t2",))
t1.start()
t2.start()
5.多线程运行时间
CPU上下文切换,并非线程越多越好;
主线程启动子线程后并行运行;
主线程等待子线程运行结束:t1.join(),等待第一个线程执行结束;
多线程等待所有执行结果:
循环外面定义列表
t线程append到列表里
for列表,t.join();

6.守护线程
threading.current_thread() #线程查看
threading.active_count() #查看活跃线程;
t.setDaemon(True) #把当前线程设置为守护线程;
守护线程服务于非守护线程;
7.python多核缺陷
全局解释器锁 gil_lock
单核永远串行;多核真正并行;
python多线程同一时间永远单核串行;
8.线程锁(互斥锁Mutex)
lock = threading.Lock()
def run():
lock.acquire() #加锁
pass
locl.release() #释放锁
加锁会使程序变串行;
9.递归锁
lock = threading.RLock()
10.信号量
semaphore = threading.BoundedSemaphore(5) #最多允许5个线程同时允许;
def run():
semaphore.acquire() #加锁
pass
semaphore.release() #释放锁

连接池场景下使用;同一时刻同时运行多个线程;
11.线程间通信event
event = threading.Event()
event.set() #设置,标志位被设定,直接通行
event.clear() #清空,标志位被清空,等待设置;
event.wait() #等待标志位被设定
event.is_set)() #判断是否设置了标志位;

12.queue队列
import queue
排队等待处理数据;
程序解耦;提高运行效率
queue.qsize() #判断队列大小
q = queue.Queue(maxsize=3) #设定队列大小 ,先入先出 FIFO
q.put('aa') #放数据
q.get() #取数据
q = queue.LifoQueue(maxsize=3) #后入先出;LIFO
q = queue.PriorityQueue(maxsize=3) #存储数据时设定优先级先出;
q.put((10,"test")) 优先级高
q.put(3,"test2)) 优先级底
生产者消费者模型;
主要作用:程序解耦,使程序之间实现松耦合;
提高处理效率;



 

posted @ 2018-01-26 14:55  hanfuming  阅读(113)  评论(0编辑  收藏  举报