lesson15解答作业和聊天室
1 #视频1-一周的梳理 2 #1, 3 json--序列化和反序列化 4 dumps 字符串转换 5 loads 6 dump 文件中转换 7 load 8 9 json.__all__ 10 11 #2, 12 hashlib-加密 13 加盐,md5,sha512 14 查看码-hexdigest,digest 15 对密码加密-pbkdf2_hmac 16 17 #3, 18 base64转码,解码 19 普通编码解码--b64encode,b64decode 20 url编码解码--urlsafe_b664encode,rulsafe_b64decode 21 #4, 22 os-文件,路径 23 24 25 #5,python操作mysql 26 1,import pymysql 27 2,建立连接---pymysql.connect 28 3,定义游标 29 4,execute--执行sql语句的方法 30 5,fetchone--获取一条信息 31 6,fetchall--获取全部信息 32 7,插入数据默认会开启事务 33 8,commit 34 9,关闭游标 35 10,关闭连接 36 37 #6,python操作redis 38 1,import redis 39 2,建立连接--redis.Redis 40 3,直接操作 41 42 #7,mysql常用操作 43 1,创建用户,赋予权限,立即生效,用户,库,表,数据 44 2,mysql-uroot-pqwe123 45 3,表约束:非空,唯一,主键,外键,自增长,默认 46 4,表关系:一对一,一对多,多对多 47 5,查询:单表查询,子查询,关联查询, 48 6,内外连接:有无条件,左右 49 50 #8,redis 51 1,字符串string 52 2,列表list 53 3,哈希hash 54 4,集合set 55 5,有序集合zset
----------------------------------------------------------
#视频2-作业讲解
#作业:
参照多线程的生产者和消费者模式,实现多进程的(manager)
//15作业生产消费多进程1.py:
1 import multiprocessing as mp 2 from multiprocessing import Manager 3 import random 4 import queue 5 import time 6 7 #多进程--生产和消费模型 8 #生产者-只关心队列是否已满。没满则生产,慢了就阻塞 9 class Producer(mp.Process): 10 def __init__(self,QUE): 11 super().__init__() 12 self.q = QUE 13 14 def run(self): 15 while True: 16 data = random.randint(0,99) #生产一个数据 17 print('生产了:', data) 18 self.q.put(data) #数据丢到队列中 19 time.sleep(1) 20 21 22 #消费者-只关心队列是否为空。不为空,则消费,为空则阻塞 23 class Concumer(mp.Process): 24 def __init__(self,QUE): 25 super().__init__() 26 self.q= QUE 27 28 def run(self): 29 while True: 30 item =self.q.get() #从队列中拿数据 31 print('消费者拿到:',item) 32 33 mgr = Manager() 34 q =mgr.Queue(5) #创建队列 35 36 p = Producer(q) #生产者 37 c =Concumer(q) #消费者 38 39 p.start() 40 c.start() 41 42 p.join() #等待子进程把任务做完, 43 c.join()
#运行:
生产了: 17
消费者拿到: 17
生产了: 76
消费者拿到: 76
生产了: 73
消费者拿到: 73
生产了: 87
消费者拿到: 87
生产了: 60
消费者拿到: 60
生产了: 92
消费者拿到: 92
----------------------------------------------------------
#视频3-聊天室
//聊天室--类似qq群聊,都能看到消息
//服务端:
1 import multiprocessing as mp 2 import socket 3 4 server = socket.socket() 5 server.bind(('0.0.0.0', 8882)) 6 server.listen(100) 7 8 #发消息 9 def send_data(data): 10 #print(data) 11 for addr, conn in list_prox.items(): 12 conn.send(data.encode()) 13 14 #收消息, 构造消息 15 def recv_data(conn,addr): 16 while True: 17 try: 18 data = conn.recv(1024) 19 if data: 20 data = '收到来自{}的消息:{}'.format(addr, data.decode()) 21 send_data(data) 22 else: 23 raise Exception 24 except: 25 conn.close() 26 list_prox.pop(addr) # 从用户字典中删除 27 28 data_exit = '用户{}退出'.format(addr) 29 send_data(data_exit) 30 break 31 32 mgr = mp.Manager() 33 list_prox = mgr.dict() #用户信息字典 地址当做键, 对等套接字当做值 34 35 36 #处理用户的连接 37 while True: 38 conn,addr = server.accept() 39 list_prox.setdefault(addr, conn) 40 login = '用户{}登录'.format(addr) 41 #print(login) 42 send_data(login) 43 44 mp.Process(target=recv_data, args=(conn, addr) ).start()
//客户端
1 import socket 2 import multiprocessing as mp 3 4 client = socket.socket() 5 client.connect(('127.0.0.1', 8888)) 6 7 8 def func(): 9 while True: 10 recv_data = client.recv(1024) 11 print('收到的消息:', recv_data.decode()) 12 13 14 mp.Process(target=func).start() 15 while True: 16 data = input('') 17 client.send(data.encode())
#运行:
client1:
收到的消息: 用户('127.0.0.1', 47870)登录
收到的消息: 用户('127.0.0.1', 47872)登录
你好
你好
收到的消息: 收到来自('127.0.0.1', 47870)的消息:你好
收到的消息: 收到来自('127.0.0.1', 47872)的消息:都能收到吗?
client2:
收到的消息: 用户('127.0.0.1', 47872)登录
收到的消息: 收到来自('127.0.0.1', 47870)的消息:你好
都能收到吗?
都能收到吗?
收到的消息: 收到来自('127.0.0.1', 47872)的消息:都能收到吗?