Python +大数据-Python进阶(一)

Python +大数据-Python进阶(一)

1. 多任务编程-进程

1.1 多任务的执行方式(并发-并行)

并发: 在一段时间内交替去执行任务。

并行:
对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。这里需要注意多核cpu是并行的执行多任务,始终有多个软件一起执行。

1.2 进程

  • 进程是操作系统进行资源分配的基本单位。
  • 进程是Python程序中实现多任务的一种方式
1.2.1 进程的介绍
在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式
1.2.2 进程的概念
一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
注意:
一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。

1.3 多进程的使用

  1. 导入进程包
    • import multiprocessing
  2. 创建子进程并指定执行的任务
    • sub_process = multiprocessing.Process (target=任务名)
  3. 启动进程执行任务
    • sub_process.start()
#导包
import multiprocessing
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())

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8J3uFUuu-1663039134442)(C:\Users\liuyikang\AppData\Roaming\Typora\typora-user-images\image-20220911113113635.png)]

  • 为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行
  • 设置守护主进程方式: 子进程对象.daemon = True
  • 销毁子进程方式: 子进程对象.terminate()

2. 多线程编程-线程

2.1 线程的概念

线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度,也就是说线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。

2.2 线程的使用

Thread([group [, target [, name [, args [, kwargs]]]]])

  • group: 线程组,目前只能使用None
  • target: 执行的目标任务名
  • args: 以元组的方式给执行任务传参
  • kwargs: 以字典方式给执行任务传参
  • name: 线程名,一般不用设置
#导入线程模块
import threading
  1. 导入线程模块
    • import threading
  2. 创建子线程并指定执行的任务
    • sub_thread = threading.Thread(target=任务名)
  3. 启动线程执行任务
    • sub_thread.start()

2.3线程执行带有参数的任务

  • 线程执行任务并传参有两种方式:
    • 元组方式传参(args) :元组方式传参一定要和参数的顺序保持一致。
    • 字典方式传参(kwargs):字典方式传参字典中的key一定要和参数名保持一致。
导入线程模块
import threading

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

2.4 线程的注意点

  • 线程执行执行是无序的
  • 主线程默认会等待所有子线程执行结束再结束,设置守护主线程的目的是主线程退出子线程销毁。
  • 线程之间共享全局变量,好处是可以对全局变量的数据进行共享。
  • 线程之间共享全局变量可能会导致数据出现错误问题,可以使用线程同步方式来解决这个问题。
    • 线程等待(join)

2.5 进程和线程的对比

  • 进程和线程都是完成多任务的一种方式
  • 多进程要比多线程消耗的资源多,但是多进程开发比单进程多线程开发稳定性要强,某个进程挂掉不会影响其它进程。
  • 多进程可以使用cpu的多核运行,多线程可以共享全局变量。
  • 线程不能单独执行必须依附在进程里面
进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核

3. 网络编程

3.1 IP地址介绍

  • IP 地址的作用是标识网络中唯一的一台设备的
  • IP 地址的表现形式分为: IPv4 和 IPv6
  • 查看网卡信息:ifconfig
  • 检查网络: ping

3.2端口和端口号的介绍

  • 端口的作用就是给运行的应用程序提供传输数据的通道
  • 端口号的作用是用来区分和管理不同端口的,通过端口号能找到唯一个的一个端口
  • 端口号可以分为两类:知名端口号和动态端口号
    • 知名端口号的范围是0到1023
    • 动态端口号的范围是1024到65535

3.3 TCP的介绍

面向连接
通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
可靠传输
TCP 采用发送应答机制
超时重传
错误校验
流量控制和阻塞管理

TCP 是一个稳定、可靠的传输协议,常用于对数据进行准确无误的传输,比如: 文件下载,浏览器上网。

3.4 socket介绍

socket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个 socket。

socket的作用
负责进程之间的网络数据传输,好比数据的搬运工。

进程之间网络数据的传输可以通过 socket 来完成, socket 就是进程间网络数据通信的工具。

3.5 TCP网络应用程序开发流程

客户端开发介绍:
1.创建客户端套接字对象
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字


服务端开发流程介绍:
1.创建服务端端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字

3.6 TCP客户端程序开发

  1. 导入socket模块
  2. 创建TCP套接字‘socket’
    • 参数1: ‘AF_INET’, 表示IPv4地址类型
    • 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
  3. 发送数据‘send’
    • 参数1: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
  4. 接收数据‘recv’
    • 参数1: 表示每次接收数据的大小,单位是字节
  5. 关闭套接字‘socket’表示通信完成

image-20220912175633980

3.7 TCP服务端程序开发

  1. 导入socket模块
  2. 创建TCP套接字‘socket’
    • 参数1: ‘AF_INET’, 表示IPv4地址类型
    • 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
  3. 绑定端口号‘bind’
    • 参数: 元组, 比如:(ip地址, 端口号)
  4. 设置监听‘listen’
    • 参数: 最大等待建立连接的个数
  5. 等待接受客户端的连接请求‘accept’
  6. 发送数据‘send’
    • 参数: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
  7. 接收数据‘recv’
    • 参数: 表示每次接收数据的大小,单位是字节,注意: 解码成字符串使用decode()方法
  8. 关闭套接字‘socket’表示通信完成

image-20220912175652185

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。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值