协程:
单线程下由应用程序级别实现的并发,即把本来由操作系统控制的切换+保存状态,在应用程序里实现
协程的切换vs操作系统的切换
优点:
切换速度远快于操作系统
缺点:
一个任务阻塞了,其余的任务都无法执行
Ps:只有遇到IO才切换到其他任务的协程才能提升单线程的执行效率
把耽搁线程的IO降到最低,最大限度的提升单个线程的执行效率
实现方式
From gevent import spawn,monkey;monkey.patch.all()
IO模型:
block io 阻塞io
nonblocking io 非阻塞io
1、对cpu的无效暂用率过高
2、不能及时反馈客户端的信息
1、IO多路复用
服务器:
server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) server.setblocking(False) data_dic={} read_list=[server,] write_list=[] print('start....') while True: rl,wl,xl=select.select(read_list,write_list,[]) #read_list=[server,conn1,conn2,conn3,conn4] #select.select是系统调用功能,是操作系统问,当没有秒数的时候会堵塞,当有秒数时会等#到几秒内没有用户访问,就运行下面的内容,然后再返回到这个等待地方 #rl 有数据的列表套接字 里面有一个server 后期有多个conn # 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: conn,addr=sk.accept() read_list.append(conn) else: # sk.recv(1024) # print(sk) data=sk.recv(1024) write_list.append(sk) data_dic[sk]=data#sk套接字,data消息内容 for sk in wl: sk.send(data_dic[sk].upper()) data_dic.pop(sk) write_list.remove(sk)
客户端:
import socket chile = socket.socket() chile.connect(("127.0.0.1",8080)) while True: msg = input(">>:").strip() if len(msg)==0:continue chile.send(msg.encode("utf-8")) func=chile.recv(1024) print(func.decode("utf-8"))
异步IO效率最高
2、数据库mysql
数据库本质就是一个C/S的套接字软件
常见的数据库:
关系型:
Mysql
Mariadb
Oracle
Db2
Sqlserver
非关系:
存取数据都是以key:value
Mongodb
Redis
Memcache
2.1、数据库相关概念:
数据库服务器:运行有数据库管理软件的计算机
数据库管理软件mysql:就是一个套接字服务器
库:就是一个文件夹
表:就是一个文件
记录:就相当于文件中的一行内容(抽取事物一系列典型的特征拼接到一起)
数据:用于记录现实世界中的某种状态
下载mysql数据库
https://dev.mysql.com/downloads/mysql/ 选择双数版本,求的是稳定性
解压完就是安装完毕
Bin存放可执行文件
其中mysqld.exe就是套接字服务端,mysql.exe为mysql自带的客户端软件
Data里面一个文件夹就是一个库,ib_logfile数据日志文件
my-default配置文件
切换到E盘的mysql文件
启动服务器
绑定IP,端口,默认127.0.0.1,3306
h为服务端IP,大P为端口号,密码有空格,p后面要加引号
查看当前登入的用户,root@localhost 表示着用户root登入的是本地
显示登入的是两个进程,在本地,服务端是19008上面的,下面的是客户端16980
按quit;退出,然后mysqld --verbose --help配置文件,要远程服务端,服务器地址就不要是默认的127.0.0.1,而是服务器地址
绑定ip“0.0.0.0”是只要拼通就都能访问到本机
通过mysqld --install将服务器添加到服务端,这样可以直接在上面运行
s查看mysql的字符编码
字符编码不一致
可以通过新建my.ini里面统一字符编码设置
[mysqld]#bin目录下的命令名,服务器
character-set-server=utf8
collation-server=utf8_general_ci
[client]#也是针对于客户端,客户端的全局性配置,所有客户来都加载这个
default-character-set=utf8
[mysql]#客户端
default-character-set=utf8
Mysql removed 初始化服务器 服务器里的mysql被删,要重新mysql --install添加
只有修改mysqld里面的内容才需要重启服务端
指定用户默认账户