【Python】0基础学Python——进程创建,进程通信,TCP服务器和客户端,服务端与客户端聊天案例,python动态性

进程创建—构造方法

1. 使用os模块中的 fork 函数(只能应用于 Linux 操作系统)

该函数 会返回 2次结果
第一次结果代表创建的子进程的进程编号
第二次结果永远返回0,代表程序处于子进程中

2. 使用 from multiprocessing import Process

Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
- target: 是一个函数、是进程执行任务的地方
- name : 设置进程的名字
- args : 给目标函数 target 传递不定项位置参数
- kwargs : 给目标函数 target 传递不定项关键字参数
- daemon : 设置进程是否为守护进程、默认False

3. 继承 Process 类来定义一个进程类,重写run方法

获取进程相关信息

os.getpid(): 获取进程编号
os.getppid(): 获取父进程编号
p.name(): 获取进程名

import os
from multiprocessing import Process


def test(a, b):
    print(os.getpid(), os.getppid(), a + b)  # 7568 4168 30  (ID不唯一)


if __name__ == '__main__':
    # 创建子进程
    p = Process(target=test, args=(10, 20))
    p.start()
    # os.getpid() -> 获取当前进程ID
    # os.getppid() -> 获取当前进程父进程的ID
    print(os.getpid(), os.getppid())  # 4168 7188  (ID不唯一)

进程创建—继承Process类

import os
from multiprocessing import Process


class MyProcess(Process):
    def __init__(self, a, b):
        super().__init__()  # 必须调用父类初始化方法
        self.a = a
        self.b = b

    def run(self):
        print(os.getpid(), os.getppid(), self.a + self.b)


if __name__ == '__main__':
    p = MyProcess(10, 20)
    p.start()

    print(os.getpid(), os.getppid())

进程—数据独立

# 添加
import os
from multiprocessing import Process, current_process


# 进程之间数据独立
def addNum(ls):
    for i in range(5):
        ls.append(i)
    print(os.getpid(), ls)  # 7220 [0, 1, 2, 3, 4]


# 获取
def getNum(ls):
    print(os.getpid(), ls)  # 4072 []


if __name__ == '__main__':
    ls = []
    p1 = Process(target=addNum, args=(ls,))
    p2 = Process(target=getNum, args=(ls,))
    p1.start()
    p2.start()

    print(p1.name, p2.name)  # Process-1 Process-2

进程—多进程卖票

import os
import time
from multiprocessing import RLock, Process, Queue
from typing import List


class Ticket:
    def __init__(self, t_no):
        self.t_no = t_no


def sell(t_list: Queue, lock):
    while not t_list.empty():
        time.sleep(0.2)
        with lock:
            if not t_list.empty():
                ticket = t_list.get()
                print(f'{os.getpid()}卖了{ticket.t_no}票,剩余{t_list.qsize()}张')


if __name__ == '__main__':
    lock = RLock()
    queue = Queue(maxsize=100)
    for i in range(1, 101):
        queue.put(Ticket(i))
    pools = []
    for i in range(5):
        t = Process(target=sell, args=(queue, lock))  # lock必须传参
        pools.append(t)
        t.start()

    for th in pools:
        th.join()  # 阻塞主进程,子进程执行完毕,主进程继续执行

    print('票已售罄')

网络编程概念

网络七层模型

应用层: 为计算机用户提供服务,网站
表示层:数据处理(编解码、加密解密、压缩解压缩)
会话层:管理(建立、维护、重连)应用程序之间的会话
传输层:为两台主机进程之间的通信提供通用的数据传输服务,TCP UDP
网络层:路由和寻址(决定数据在网络的游走路径)
数据链路层:帧编码和误差纠正控制
物理层:透明地传送比特流传输


应用层、常见的协议 http, https , ftp, smtp, pop 等协议
数据传输层: TCP 和 UDP 协议

TCP和UDP的区别

TCP 是一个面向连接的 安全协议、采用三次握手和四次挥手保证数据传输的稳定性
UDP 是一个不可靠的协议、通过数据报文的形式进行数据传输、速度快、不稳定,在数据传输过程中,容易产生 数据丢失
三次握手
客户端第一次请求连接
服务端确认是否连接
客户端确认要连接
四次挥手
客户端请求断开连接
服务端发送未完成的信息
服务端确认是否断开连接
客户端确认要断开连接

TCP—服务器

import pickle
from socket import socket

# 1.创建一个服务端套接字
socket_server = socket()

# 2.绑定ip和端口
# ip:0.0.0.0  本地:127.0.0.1   本机:192.168.17.19
# 端口: 范围0-65535,不能和已知的端口发生冲突
socket_server.bind(('127.0.0.1',8888))

# 3.监听
socket_server.listen(5)

# 4.被动等待客户端连接
while True:
	# 5.获取连接通道对象和address
	socket_client,address = socket_server.accept()
	print(socket_client,address)
	# 6.接收信息
	msg = socket_client.recv(1024 * 5)
	# print(msg.decode())
	print(pickle.loads(msg))

	# 7. ① 向客户端回复信息
	# socket_client.send('服务器发来的消息1'.encode())
	# socket_client.send('服务器发来的消息1'.encode())

	# 7. ② 向客户端回复信息
	ls = ['信息1', '信息2']
	socket_client.send(pickle.dumps(ls))

TCP—客户端

import pickle
from socket import socket

# 1.创建客户端套接字
socket_client = socket()

# 2.连接服务器
socket_client.connect(('127.0.0.1', 8888))

# 3.发送信息
# socket_client.send('客户端发送的信息1'.encode())
# socket_client.send('客户端发送的信息1'.encode())
ls = ['客户端发送的信息1', '客户端发送的信息2']
socket_client.send(pickle.dumps(ls))

# 4.接收信息
msg = socket_client.recv(1024 * 5)
while msg:
	# ①
    # print(msg.decode())
    # ②
    # print(pickle.loads(msg))
    print(' '.join(map(str, pickle.loads(msg))))
    msg = socket_client.recv(1024 * 5)
# 5.关闭连接
socket_client.close()

聊天—服务端

1.创建服务端套接字
2.绑定ip地址和端口
3.监听
4.被动等待客户端发送消息
5.获取连接通道对象和地址
6.收发消息

from socket import socket

# 1.创建一个服务端套接字
socket_server = socket()
# 2.绑定ip和端口
socket_server.bind(('127.0.0.1', 8888))
# 3.监听
socket_server.listen(5)
# 4.被动等待客户端连接
while True:
    # 5.获取连接通道对象和address
    socket_client, address = socket_server.accept()
    # 收发信息
    while True:
        # 接收信息
        msg = socket_client.recv(1024 * 5)
        s = msg.decode()
        if s == 'exit':
            break
        print(s)
        info = input('服务端说:')
        socket_client.send(info.encode())

聊天—客户端

1.创建客户端套接字
2.连接服务端
3.发送消息
4.接收信息
5关闭连接

from socket import socket

# 1.创建客户端套接字
socket_client = socket()
# 2.连接服务端
socket_client.connect(('127.0.0.1', 8888))
# 3.发送消息
socket_client.send('这是客户端'.encode())
# 4.接收信息
while msg := socket_client.recv(1024 * 5):
    print(msg.decode())
    info = input('客户端说:')
    socket_client.send(info.encode())

# 5关闭连接
socket_client.close()

python动态性

import os
import types


class Student:
    pass

stu = Student()
# 添加实例属性
stu.name = 'zs'
stu.age = 18


def show(self):
    print('实例方法')


# 添加实例方法
stu.shows = types.MethodType(show, stu)
stu.shows()


# 添加类方法
@classmethod
def test1(cls):
    print('类方法')


Student.test11 = test1
Student.test11()


@staticmethod
def test2():
    print('静态方法')


Student.test22 = test2
Student.test22()


# 猴子补丁
def eat(name):
    print(f'{name}吃西红柿')


def eat2(name):
    print(f'{name}吃番茄')


eat('张三')
eat = eat2
eat('张三')

p = os.walk('./a')
# print(next(p))
# print(next(p))
# print(p)
res = []
for i in p:
    # print(i)
    res.extend(i[2])
print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值