Python +大数据-Python进阶(一)
1. 多任务编程-进程
1.1 多任务的执行方式(并发-并行)
并发: 在一段时间内交替去执行任务。
并行:
对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。这里需要注意多核cpu是并行的执行多任务,始终有多个软件一起执行。
- 1
- 2
- 3
- 4
1.2 进程
- 进程是操作系统进行资源分配的基本单位。
- 进程是Python程序中实现多任务的一种方式
1.2.1 进程的介绍
在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式
- 1
1.2.2 进程的概念
一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
注意:
一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。
- 1
- 2
- 3
1.3 多进程的使用
- 导入进程包
- import multiprocessing
- 创建子进程并指定执行的任务
- sub_process = multiprocessing.Process (target=任务名)
- 启动进程执行任务
- sub_process.start()
#导包
import multiprocessing
- 1
- 2
1.3.1Process进程类的说明
- group:指定进程组,目前只能使用None
- target:执行的目标任务名
- name:进程名字
- args:以元组方式给执行任务传参
- kwargs: 以字典方式给执行任务传参
Process创建的实例对象的常用方法:
- start():启动子进程实例(创建子进程)
- join():等待子进程执行结束
- terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
1.4进程的注意点
# 导入多进程模块
import multiprocessing
import os
def login(name,password):
print('名字:',name)
print('密码:', password)
print('登录')
# 获取当前进程名称
print('进程名称:',multiprocessing.current_process().name)
# 获取当前进程编号
print('子进程:', os.getpid())
# 获取主进程编号
print('子进程的父进程编号:', os.getppid())
if __name__== '__main__':
# login()
# login()
# 使用多进程的形式完成多次调用
# group=None 指定分组,默认为None,
# target=None 指定要调用的函数名,
# name=None 指定进程名称,
# args=(), kwargs={}给函数传递参数,
# daemon=None 指定守护进程
# 创建了一个进程
# 注意不能用小写process方法
print(chr(100))
p1 = multiprocessing.Process(target=login,args=('python',11111111),name='p1')
p2 = multiprocessing.Process(target=login,kwargs={'name':'itcast','password':22222222},name='p2')
p3 = multiprocessing.Process(target=login, kwargs={'name': 'itcast', 'password': 22222222}, name='p3')
# 运行进程指定对应函数业务逻辑
# 如果需要进程同步按照循序执行,需要用到进程等待join方法
p1.start()
# 等待进程p1执行完成后在执行其他的进程
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# 获取当前进程编号
print('主进程:',os.getpid())
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8J3uFUuu-1663039134442)(C:\Users\liuyikang\AppData\Roaming\Typora\typora-user-images\image-20220911113113635.png)]
- 为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行。
- 设置守护主进程方式: 子进程对象.daemon = True
- 销毁子进程方式: 子进程对象.terminate()
2. 多线程编程-线程
2.1 线程的概念
线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度,也就是说线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
- 1
2.2 线程的使用
Thread([group [, target [, name [, args [, kwargs]]]]])
- group: 线程组,目前只能使用None
- target: 执行的目标任务名
- args: 以元组的方式给执行任务传参
- kwargs: 以字典方式给执行任务传参
- name: 线程名,一般不用设置
#导入线程模块
import threading
- 1
- 2
- 导入线程模块
- import threading
- 创建子线程并指定执行的任务
- sub_thread = threading.Thread(target=任务名)
- 启动线程执行任务
- sub_thread.start()
2.3线程执行带有参数的任务
- 线程执行任务并传参有两种方式:
- 元组方式传参(args) :元组方式传参一定要和参数的顺序保持一致。
- 字典方式传参(kwargs):字典方式传参字典中的key一定要和参数名保持一致。
导入线程模块
import threading
- 1
- 2
def func(data):
print(‘线程使用’)
print(f’参数数据:{data}’)
# 获取当前执行线程的名称
print(‘线程名称:’,threading.current_thread().name)
if name == ‘main’:
# 创建线程
# group = None, 使用默认
# target = None, 指定函数方法
# name = None, 指定线程名称
# args = (), kwargs = None, 传递参数
# daemon = None 设置守护线程
t1 = threading.Thread(target=func,args=('python',),name='t1')
t2 = threading.Thread(target=func,kwargs={'data':'itcast'},name='t2')
# 启动运行线程
t1.start()
t2.start()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2.4 线程的注意点
- 线程执行执行是无序的
- 主线程默认会等待所有子线程执行结束再结束,设置守护主线程的目的是主线程退出子线程销毁。
- 线程之间共享全局变量,好处是可以对全局变量的数据进行共享。
- 线程之间共享全局变量可能会导致数据出现错误问题,可以使用线程同步方式来解决这个问题。
- 线程等待(join)
2.5 进程和线程的对比
- 进程和线程都是完成多任务的一种方式
- 多进程要比多线程消耗的资源多,但是多进程开发比单进程多线程开发稳定性要强,某个进程挂掉不会影响其它进程。
- 多进程可以使用cpu的多核运行,多线程可以共享全局变量。
- 线程不能单独执行必须依附在进程里面
进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核
- 1
- 2
- 3
- 4
- 5
- 6
3. 网络编程
3.1 IP地址介绍
- IP 地址的作用是标识网络中唯一的一台设备的
- IP 地址的表现形式分为: IPv4 和 IPv6
- 查看网卡信息:ifconfig
- 检查网络: ping
3.2端口和端口号的介绍
- 端口的作用就是给运行的应用程序提供传输数据的通道。
- 端口号的作用是用来区分和管理不同端口的,通过端口号能找到唯一个的一个端口。
- 端口号可以分为两类:知名端口号和动态端口号
- 知名端口号的范围是0到1023
- 动态端口号的范围是1024到65535
3.3 TCP的介绍
面向连接
通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
可靠传输
TCP 采用发送应答机制
超时重传
错误校验
流量控制和阻塞管理
TCP 是一个稳定、可靠的传输协议,常用于对数据进行准确无误的传输,比如: 文件下载,浏览器上网。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.4 socket介绍
socket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个 socket。
socket的作用
负责进程之间的网络数据传输,好比数据的搬运工。
进程之间网络数据的传输可以通过 socket 来完成, socket 就是进程间网络数据通信的工具。
- 1
- 2
- 3
- 4
- 5
- 6
3.5 TCP网络应用程序开发流程
客户端开发介绍:
1.创建客户端套接字对象
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字
服务端开发流程介绍:
1.创建服务端端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3.6 TCP客户端程序开发
- 导入socket模块
- 创建TCP套接字‘socket’
- 参数1: ‘AF_INET’, 表示IPv4地址类型
- 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
- 发送数据‘send’
- 参数1: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
- 接收数据‘recv’
- 参数1: 表示每次接收数据的大小,单位是字节
- 关闭套接字‘socket’表示通信完成
3.7 TCP服务端程序开发
- 导入socket模块
- 创建TCP套接字‘socket’
- 参数1: ‘AF_INET’, 表示IPv4地址类型
- 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
- 绑定端口号‘bind’
- 参数: 元组, 比如:(ip地址, 端口号)
- 设置监听‘listen’
- 参数: 最大等待建立连接的个数
- 等待接受客户端的连接请求‘accept’
- 发送数据‘send’
- 参数: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
- 接收数据‘recv’
- 参数: 表示每次接收数据的大小,单位是字节,注意: 解码成字符串使用decode()方法
- 关闭套接字‘socket’表示通信完成
3.8 TCP网络程序的注意点
1.当 TCP 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接
2.TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
3.TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
4.listen 后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
5.当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
6.关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
7.关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
8.当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已 经下线,反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8