day40
day40 epoll和数据库
阻塞的真正的原因
1.第一步需要给每一个socket的等待队列中添加进程信息
2.唤醒进程后,进程必须遍历所有socket,才能知道哪些socket有数据
3.还要遍历所有socket,将进程从等待队列中删除
上述操作,会大量消耗系统资源,必须限制同时处理的socket数量
select处理方式比较直接简洁,在任何平台上都有对应的实现,都能用
poll是对select的改造,但是不完善
epoll如何解决上述问题
epoll只有linux提供
解决问题
1.避免频繁操作等待队列
2.避免遍历所有socket
register 和unregister
epoll的执行过程
客户端代码
#coding:utf-8
#客户端
#创建客户端socket对象
import socket
clientsocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#服务端IP地址和端口号元组
server_address = ('127.0.0.1',1688)
#客户端连接指定的IP地址和端口号
clientsocket.connect(server_address)
while True:
#输入数据
data = raw_input('please input:')
if data == "q":
break
if not data:
continue
#客户端发送数据
clientsocket.send(data.encode("utf-8"))
#客户端接收数据
server_data = clientsocket.recv(1024)
print ('客户端收到的数据:',server_data)
#关闭客户端socket
clientsocket.close()
服务器代码
# coding:utf-8
import socket, select
server = socket.socket()
server.bind(("127.0.0.1", 1688))
server.listen(5)
msgs = []
fd_socket = {server.fileno(): server}
epoll = select.epoll()
# 注册服务器的 写就绪
epoll.register(server.fileno(), select.EPOLLIN)
while True:
for fd, event in epoll.poll():
sock = fd_socket[fd]
print(fd, event)
# 返回的是文件描述符 需要获取对应socket
if sock == server: # 如果是服务器 就接受请求
client, addr = server.accept()
# 注册客户端写就绪
epoll.register(client.fileno(), select.EPOLLIN)
# 添加对应关系
fd_socket[client.fileno()] = client
# 读就绪
elif event == select.EPOLLIN:
data = sock.recv(2018)
if not data:
# 注销事件
epoll.unregister(fd)
# 关闭socket
sock.close()
# 删除socket对应关系
del fd_socket[fd]
print(" somebody fuck out...")
continue
print(data.decode("utf-8"))
# 读完数据 需要把数据发回去所以接下来更改为写就绪=事件
epoll.modify(fd, select.EPOLLOUT)
#记录数据
msgs.append((sock,data.upper()))
elif event == select.EPOLLOUT:
for item in msgs[:]:
if item[0] == sock:
sock.send(item[1])
msgs.remove(item)
# 切换关注事件为写就绪
epoll.modify(fd,select.EPOLLIN)
#####数据库
数据库本质是一套CS结构的TCP程序,客户端连接到服务器,向服务器发送指令,完成数据的操作
数据库与文件系统的对应关系
一个数据项name = jerry本质是文件中某一行的一部分数据
一条记录:jerry,18,man本质是文件里的一行数据
一张表:本质是一个文件
数据库:本质是文件夹
DBMS:数据库的管理系统,数据库的服务端程度
修改管理员密码
windows
启动服务:net start mysql
1.知道密码
mysqladmin -uroot -p旧密码 password新密码
2.不知道原始密码的情况
跳过授权表:在启动服务器时候,指定让其忽略授权信息.
启动mysql的时候,跳过授权表
mysqld --skip -grant -tables
改密码
update mysql.user set password =password("123") where User="root" and host="localhost"
# 数据库相关概念 非常重要
数据库本质就是一套CS结构的TCP程序,
客户端连接到服务器 向服务器发送指令,来完成数据的操作
# 数据库 与 文件系统的对应关系 非常重要
一个数据项 name = jerry 本质是文件中某一行的 一部分数据
一条记录 jerry,18,man 本质是文件里的一行数据
一张表 本质是一个文件
数据库 文件夹
DBMS DataBaseManagerSystem 数据库管理系统 数据库的服务器端程序
数据库服务器 运行有DBMS的计算机
## 安装方式: 掌握
1.下载解压包
2.解压到某个目录下
3.添加环境变量
将bin所在的完整路径 copy 添加系统的path中
4.作为服务器 应该自启动mysql服务器 需要制系统服务
mysqld --install 运行输入services 查看是是否成功
删除服务 sc delete mysql 如果需要重装的话...
启动服务 net start mysql
停止服务 net stop mysql
# 连接服务器的指令 必要掌握
本质是TCP程序,必须指定ip和端口 ,如果服务器就运行在本机上 可以省略ip 如果端口没改过 也可以省略端口
完整的写法 :
```python
mysql -hip -P端口 -u用户名 -p密码
实例: mysql -uroot -p
mysql 5.6 默认是没有密码的
```
## 修改管理员密码 了解
1.如果知道原始密码 可以使用mysqladmin 这个工具
```python
mysqladmin -p旧密码 -u用户名 password 新密码
实例: mysqladmin -uroot -p password 123
```
2.不知道原始密码的情况
删除密码文件,会删除所有授权信息
跳过授权表 我们可以在启动服务器时 指定让其忽略授权信息
1.先关闭mysql服务器 直接在终端执行 mysqld --skip-grant-tables
2.无密码登录root账户
3.执行更新语句
update mysql.user set password = password("123") where user="root" and host = "localhost";