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 线程与进程的主要内容,如果未能解决你的问题,请参考以下文章

学习java第19天个人总结

20165322 第八周学习总结

第十周java学习总结

4月27日 python学习总结 GIL进程池线程池同步异步阻塞非阻塞

20165223《Java程序设计》第八周Java学习总结

20175310 《Java程序设计》第10周学习总结