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()

 

时间: 2024-08-11 03:20:54

python 学习总结1 线程与进程的相关文章

python学习笔记12 ----线程、进程

进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的所有资源,进程之间则是独立的). 进程(progress) 直观的说,进程就是正在执行的程序(python中每一个.py文件都可以看作是一个进程),是多任务操作系统中的基本单元,是包含了程序指令和相关资源的集合. 操作系统隔绝了每个进程可以访问的地址空间,如果进程间想要传递信息,可使用进程间通信或者

python学习笔记-Day11 (线程、进程、queue队列、生产消费模型、携程)

线程使用 ###方式一 import threading def f1(arg): print(arg) t = threading.Thread(target=f1, args=(123,)) t.start() # start会调用run方法执行 # t是threading.Thread类的一个对象 # t.start()就会以线程的方式执行函数,可以使用pycharm ctrl选择start方法 # 找到Thread类的start方法,在start方法的注释中就已经写明,会去调用run()

[Android学习系列18]线程,进程,异步的一些事

解决NetworkOnMainThreadException http://www.aitinan.com/4387.html 参考: android进程与线程详解一:进程 android进程与线程详解二:线程 android进程与线程详解三:AsyncTask android进程与线程详解四:线程安全和进程间通信 [Android学习系列18]线程,进程,异步的一些事,码迷,mamicode.com

python网络编程基础(线程与进程、并行与并发、同步与异步)

python网络编程基础(线程与进程.并行与并发.同步与异步) 目录 线程与进程 并行与并发 同步与异步 线程与进程 进程 前言 进程的出现是为了更好的利用CPU资源使到并发成为可能. 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费.聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行.注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的

Python学习笔记__10.4章 进程VS线程

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 我们介绍了多进程和多线程,这是实现多任务最常用的两种方式.现在,我们来讨论一下这两种方式的优缺点 要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker. 如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker. 如果用多线程实现Master-Worker,主线程就是Master,其

Python并发编程之线程池/进程池--concurrent.futures模块

h2 { color: #fff; background-color: #f7af0d; padding: 3px; margin: 10px 0px } 一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了conc

Python网络编程之线程与进程

What is a Thread? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 在同一个进程内的线程的数据是可以进行互相访问的. 线程的切换使用过上下文来实现的,比如有一本书,有a和b这两个人(两个线程)看,a看完之后记录当前看到那一页哪一行,然后交给b看,b看完之后记录当前看到了那一页哪一行,此时a又要看了,那么a就通过上次记录的值(上下文)直接找到上次

Python全栈开发——线程与进程(进程)

三 multiprocessing模块 Multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency,effectively side-stepping the Global Interpreter Lock

python与操作系统、线程、进程相关的操作

当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 进程操作 os.system() 函数可以启动一个进程,执行完之后返回状态码. os.fork() 复制一个进程,如果是子进程返回0,如果是父进程返回子进程的pid,使用这个函数的时候,建议你学习一下linux编程的知识.os.popen 以管道的方式创建进程.os.spawnl 也可以创建进程,并能指定环境变量. os.kill(pid, sig) 关闭一个进程,pid是进程号,sig是信号.与fork配合使用,例如你刚才