day38

今日内容:

epoll要解决的问题

1.避免频繁的对等待队列进行操作

2,避免遍历所有socket

对于第一个问题先看select的处理方式

while Ture:

r_list,w_list,x_list = select.select(rlist,wlist,xlist)

每次处理完一次读写后,都需要将所用过冲重复一遍,包括移除进程,添加进程,默认就会将进程添加到等待队列,并阻塞住进程,然而等待队列的更新操作并不频繁,

所以对于第一个问题epoll,采取的方案是,将对等待队列的维护和,阻塞进程这两个操作进行拆分

import socket,selectserver = socket.socket()server.bind(("127.0.0.1",1688))server.listen(5)

创建epoll事件对象,后续要监控的事件添加到其中

epoll = select.epoll()

**注册服务器监听fd到等待读事件

epoll.register(server.fileno(), select.EPOLLIN)   # 需要关注 server这个socket的可读事件

等待事件发生

while True: for sock,event in epoll.poll():

pass

在epoll中register 与 unregister函数用于维护等待队列

register  是进程添加到等待队列中  unregister 把进程从等待队列中删除  

epoll常用方法

import select 导入select模块

epoll = select.epoll() 创建一个epoll对象

epoll.register(文件句柄,事件类型) 注册要监控的文件句柄和事件

事件类型:

  select.EPOLLIN    可读事件

  select.EPOLLOUT   可写事件

  select.EPOLLERR   错误事件

  select.EPOLLHUP   客户端断开事件

epoll.unregister(文件句柄)   销毁文件句柄

epoll.poll(timeout)  当文件句柄发生变化,则会以列表的形式主动报告给用户进程,timeout

                 为超时时间,默认为-1,即一直等待直到文件句柄发生变化,如果指定为1

                那么epoll每1秒汇报一次当前文件句柄的变化情况,如果无变化则返回空

epoll.fileno() 返回epoll的控制文件描述符(Return the epoll control file descriptor)

epoll.modfiy(fineno,event) fineno为文件描述符 event为事件类型  作用是修改文件描述符所对应的事件

epoll.fromfd(fileno) 从1个指定的文件描述符创建1个epoll对象

epoll.close()   关闭epoll对象的控制文件描述符

案例:

import socketclientsocket = 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()

数据库:

相关概念:

本质就是一套cs结构的tcp程序

客户端连接服务器  向服务器发送指令,来完成数据的操作

数据库下载安装:

1,下载安装包

2,解压到某个目录下

3,添加环境变量

        将bin所在的完整路径copy添加到系统的path中

4.作为服务器 ,应该自启动mysql服务器   需要自系统服务

          mysql   --install     运行输入services 查看是否成功

          删除服务sc delete mysql     如果需要重新安装的话

数据库与文件系统的对应关系**

一个数据项 name = jerry     本质是文件中某一行的一部分数据

一条记录 jerry,18, man         本质就是文件里的一行数据

一张表                             本质就是一个文件

数据库                               文件夹

DBMS  DataBaseManagerSystem      数据库管理系统   数据库的服务器端程序

数据库服务器      运行有DBMS的计算机

连接服务器的指令

   本质上是TCP程序,必须指定ip和端口,如果服务器就运行在本机上 可以省略ip,如果端口没改过,就是默认端口,也可以省略端口

完整的写法:

mysql -h跟ip地址  -p端口 -u用户名 -p密码

实例:mysql -uroot -p

mysql 5.6   默认是没有密码的

注册系统服务

服务器的启动和关闭都需要执行命令,不够方便怎么办?

将mysql注册到系统服务中  mysqld --install  需要注意的是 默认注册的服务名称叫做mysql 这与bin下的mysql是两码子事,一个系统服务一个是客户端执行文件

删除服务 sc delete mysql(服务名)

查看系统服务 运行->services.msc 通常设置为自动启动。

如果注册系统服务失败则可能是因为你之前安装过mysql 卸载重装即可。

界面版的安装失败也可能是之前安装了,导致端口占用

修改管理员密码

1,如果知道原始密码 可以使用mysqladmin这个工具

mysqladmin -p旧密码  -u用户名 password 新密码

实例:mysqladmin -uroot -p password 123

2,不知道原始密码的情况

      删除密码文件,会删除所有授权信息

      跳过授权表(即密码认证) 可以在启动服务器时,指定让其忽略授权信息

net  stop mysql    停止服务

net start mysql     启动服务   

     mysql --skip-grant-tables    如果在服务器中使用了net  stop mysql 停止服务命令,先在此启动服务器就用此命令

跳过这个操作是服务器相关的操作所以 咱的先关掉服务器重新开 在重新开的时候来告诉它1.停止服务2.启动服务器并添加参数mysqld --skip-grant-tables3.使用客户端登录服务器 执行修改命令 此时不需要输入密码update mysql.user set password = password("123123") where user="root" and host="localhost"**4.刷新权限flush privileges5.命令行中重启服务器验证新密码

原文地址:https://www.cnblogs.com/Fzhiyuan/p/11006757.html