上节课复习:
1、协程
什么是?
协程指的是单线程下由应用程序级别实现的并发
即把本来由操作系统控制的切换+保存状态,在应用程序里实现了
协程的切换 vs 操作系统的切换
优点:
切换速度远快于操作系统
缺点:
一个任务阻塞了,其余的任务都无法执行
ps:只有遇到I/O才切换到其他任务的协程才能提升
单线程的执行效率
为何用?
把单个线程的I/O降到最低,最大限度地提升单个线程的执行效率
如何实现?
from gevent import monkey,spawn;monkey.path_all()
2、I/O模型
block I/O
nonblocking I/O
1、对CPU的无效占用率过高
2、不能即时反馈客户端的信息
多路复用IO模型
服务端:
from socket import *
import time,select #select模块:
server=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)
data_dic={}
read_list=[server,] #一开始会含有server的套接字
write_list=[] #针对在read_list中有数据的套接字进行写的操作
print('start......')
while True:
rl,wl,xl=select.select(read_list,write_list,[]) #read_list=[server,conn1,conn2,conn3,conn4]
# print('read_list:%s rl:%s wl:%s ' %(len(read_list),len(rl),len(wl))) #rl=[conn1,conn2]
for sk in rl:
if sk == server: #如果rl中有server就进行三次握手连接
conn,addr=sk.accept()
read_list.append(conn)
else:
# sk.recv(1204)
# print(sk)
data=sk.recv(1024)
write_list.append(sk)
data_dic[sk]=data
for sk in wl:
sk.send(data_dic[sk].upper())
data_dic.pop(sk)
write_list.remove(sk)
客户端:
from socket import *
import os
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
msg='%s say hello' %os.getpid()
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
mysql基本概念
1、数据库是什么?
数据库本质就是一个C/S的套接字软件
常见的数据库:
关系型:
Mysql、mariadb(等同于mysql)、oracle、db2、sqlserver
非关系:
存取数据都是以key:value、mongodb、redis、memcache
2、数据库相关概念
数据库服务器:运行有数据库管理软件的计算机
数据库管理软件mysql:就是一个套接字服务端
库:就是一个文件夹
表:就是一个文件
记录:就相当于文件中的一行内容(抽取事物一系列典型的特征拼到一起)
数据:用于记录现实世界中的某种状态
如果字符编码不一致时,用下图的命令来进行修正,[mysqld],[mysql],[client]分别指定不同的服务端或者是客户端的位置: