python 学习总结1 线程与进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 学习总结1 线程与进程相关的知识,希望对你有一定的参考价值。
第一次写博客
进程的定义:
程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。
在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的
有了进程为什么还要线程?
进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上:
-
进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
-
进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
例如,我们在使用qq聊天, qq做为一个独立进程如果同一时间只能干一件事,那他如何实现在同一时刻 即能监听键盘输入、又能监听其它人给你发的消息、同时还能把别人发的消息显示在屏幕上呢?你会说,操作系统不是有分时么?但我的亲,分时是指在不同进程间的分时呀, 即操作系统处理一会你的qq任务,又切换到word文档任务上了,每个cpu时间片分给你的qq程序时,你的qq还是只能同时干一件事呀。
再直白一点, 一个操作系统就像是一个工厂,工厂里面有很多个生产车间,不同的车间生产不同的产品,每个车间就相当于一个进程,且你的工厂又穷,供电不足,同一时间只能给一个车间供电,为了能让所有车间都能同时生产,你的工厂的电工只能给不同的车间分时供电,但是轮到你的qq车间时,发现只有一个干活的工人,结果生产效率极低,为了解决这个问题,应该怎么办呢?。。。。没错,你肯定想到了,就是多加几个工人,让几个人工人并行工作,这每个工人,就是线程!
Python GIL(Global Interpreter Lock):
全局解释器锁,这可以说的上是Python的一个缺陷,在Python中,无论你有多少个线程,多少个CPU在同一时刻,只能支持一个线程运行,而且所在的CPU也是随机的
但是说GIL是Python的一个缺陷是不准确的,实际上GIL是CPython的一个缺陷,类似如JPython中就无此特点。
Paramiko 模块:
知道Paramiko之前应先学习一下在linux下的文件传输 ,利用scp 命令
例如有两个地址192.168.60.128,192.168.60.129
在128中可以登录129,通过 ssh 用户名@地址 -p端口号 例如:ssh [email protected] -p22 便可以登陆到这个地址的这个账户上去,利用Ifconfig命令可以查看
当前的地址到底是哪一个
scp -rp -P端口号 文件名 用户名@地址 例如:scp -rp -P22 file.txt [email protected]:/tmp/ (这样就实现了将文件传到129的tmp下)
在python中 利用 Paramiko模块实现了 利用ssh发送命令,利用ftp 上传和下载文件 实现了简单交互
ssh:
import paramiko #创建一个ssh对象 ssh=paramiko.SSHClient() #连接服务器 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname=‘‘, port=22, username=‘mark‘, password=‘‘) #执行命令 stdin,stdout,stderr=ssh.exec_command("df") res,err=stdout.read(),stderr.read() result=res if res else err print(result.decode()) ssh.close()
ftp:
import paramiko transport=paramiko.Transport((" ",22)) transport.connect(username="mark",password=" ") sftp=paramiko.SFTPClient.from_transport(transport) """实现了将aa这个文件上传到linux的/tmp/下""" #sftp.put(‘aa‘,‘/tmp/test_from_win‘) """实现了将av这个文件从Linux下载下来""" #注意上传,与下载来的文件的路径默认都在代码所在的文件夹中 sftp.get("/tmp/av","from_linux") transport.close()
上面的实现其实都是通过了密码认证,其实这种认证很不安全,所以我们有一种方式不通过密码可以直接认证登陆以及传输文件,这种方法就是RSA- 非对称密钥验证
原理:我们有一个公钥(pubic key) ,还有一个私钥(private key)。实现的方式就是将自己的公钥传输给另一个人,放在某人的目录下,就可以访问对应的目录内容,(切记私钥是自己的,不能轻易传给别人)
流程(首先我们在linux演示下这种方法):
1.cd .ssh/ #切换到ssh目录下
2.ssh -keygen 生成私钥和公钥
3.ssh -copy -id "-p22 [email protected]" #这样我们就实现了将公钥传给129的root,获取了登陆129的权限
4.ssh [email protected] -p22 #检测登陆是否还需要密码
在Python中 :
我们通过paramiko模块也可以实现这样的功能
import paramiko #这个是发送文件的用户的私钥,文件的下载在linux下掉用 sz ~/.ssh/id_rsa 实现了下载 之后把他放在与代码同一文件夹下即可使用 private_key = paramiko.RSAKey.from_private_key_file(‘id_rsa.txt‘) # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname=‘, port=22, username=‘root‘, pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command(‘df‘) result = stdout.read() print(result.decode()) # 关闭连接 ssh.close()
以上是关于python 学习总结1 线程与进程的主要内容,如果未能解决你的问题,请参考以下文章