目录
- 进程
- 概念
- 进程
- 线程
- 理解(人话)
- 总结
- 多线程
- 动机
- 工作特点
- 理解
- 多线程编程
- 概念
- 使用
- 案例:三秒后打印内容
- 练习:扫描存活主机
- Python 模块安装
- 通过pip本地安装python模块
- 步骤
- 下载模块
- 演示离线安装
- 在线安装模块
- 使用国内镜像站点
- 演示在线安装
进程
概念
进程
- 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据
- 进程(有时被称为重量级进程)是程序的一次执行
- 每个进程都有自己的地址空间、内存以及其它记录其运行轨迹的辅助数据(称之为上下文 context)
- 操作系统管理在其上运行的所有进程,并为这些进程公平分配时间(CPU)
线程
- 线程(有时被称为轻量级进程)跟进程有些类似,不同的是所有线程运行在同一个进程中,共享相同的运行环境
- 一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程之间更方便的共享数据以及相互通讯
理解(人话)
总结
- 进程是争夺 CPU 资源的最小单位,线程是程序执行的最小单位
- 线程的执行离不开进程的资源,进程的流转离不开线程的工作
多线程
动机
- 在多线程(MT)编程出现之前,电脑程序的运行由 一个执行序列组成,执行序列按顺序在主机的中央处理器(CPU)中运行
- 无论是任务本身要求顺序执行还是整个程序是由多个子任务组成,程序都是按这种方式执行的
- 即使子任务相互独立,互相无关(即,一个子任务的结果不影响其它子任务的结果)时也是这样
- 如果并行运行这些相互独立的子任务可以大幅度地 提升整个任务的效率
工作特点
- 它们本质上就是 异步的,需要有多个并发事务
- 各个事务的运行顺序可以是 不确定的,随机的,不可预测的
- 这样的编程任务可以被分成 多个执行流,每个流都有一个要完成的目标
- 根据应用的不同,这些子任务可能都要计算出一个中间结果,用于合并得到最后的结果
理解
多线程编程
概念
- **thread 和 threading **模块允许程序员创建和管理线程
- thread 模块提供了基本的线程和锁的支持,而 threading 提供了更高级别、功能更强的线程管理功能
- 推荐使用更高级别的 threading 模块
使用
- 多线程编程有多种方法,传递函数给threading模块的Thread类是介绍的第一种方法
- Thread 对象使用 start() 方法开始线程的执行,直到线程结束
案例:三秒后打印内容
需求:使用多线程实现功能
【一般方法】
import time
# 定义方法say_hi(),功能: 打印信息
def say_hi():
time.sleep(3)
print('Hello World!')
if __name__ == '__main__':
# 当前处于主线程下,通过for循环生成工作线程t, target指定线程运行的函数
for i in range(3):
say_hi()
【多线程】
import time
import threading
# 导入多线程的模块
import threading
# 定义方法say_hi(),功能: 打印信息
def say_hi():
time.sleep(3)
print('Hello World!')
if __name__ == '__main__':
# 当前处于主线程下,通过for循环生成工作线程t, target指定线程运行的函数
for i in range(3):
t = threading.Thread(target=say_hi)
t.start() #启动工作线程, 会运行target()【等同于say_hi()】
练习:扫描存活主机
需求:
- 通过 ping 测试主机是否可达
- 如果 ping 不通,不管什么原因都认为主机不可用
- 通过多线程方式实现并发扫描
分析:
- subprocess.run() 方法可以调用系统命令,其返回值是系统命令退出码,也就是如果系统命令成功执行,返回0,如果没有成功执行,返回非零值
import subprocess
import threading
def ping(host):
result = subprocess.run(
'ping -c2 %s &> /dev/null' % host,
shell=True
)
if result.returncode == 0:
print('%s: up' % host)
else:
print('%s: down' % host)
if __name__ == '__main__':
ips = ['172.40.58.%s' % i for i in range(1, 255)]
for ip in ips:
# 创建线程,ping是上面定义的函数, args是传给ping函数的参数
t = threading.Thread(target=ping, args=(ip,))
t.start() # 执行ping(ip)
Python 模块安装
通过pip本地安装python模块
- pip 是 Python 包管理工具
- 提供了对 Python 包的查找、下载、安装、卸载的功能
- 下载模块后解压缩并安装
步骤
下载模块
演示离线安装
上传 wget-3.2.zip 到 pycharm 主机
[root@localhost ~]# unzip wget-3.2.zip # 解压
[root@localhost ~]# cd wget-3.2/ # 进入到wget解压目录下
[root@localhost wget-3.2]# python3 setup.py install # 安装wget
[root@localhost wget-3.2]# pip3 list |grep -i wget # 查看wget的版本
在线安装模块
使用国内镜像站点
[root@localhost xxx]# mkdir ~/.pip #在root家目录下,创建隐藏目录.pip
[root@localhost xxx]# vim ~/.pip/pip.conf #创建,配置国内镜像源,index-url 指定国内镜像源路径,trusted-host 信任该镜像网站,否则无法使用
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
演示在线安装
使用pip尝试安装,可以看到配置的国内镜像站点
[root@localhost xxx]# pip3 install wget