数据库 tcp协程实现并发 回调函数

数据库 tcp协程实现并发 回顾

一、补充

  • 进程池,线程池,回调函数
# from gevent import monkey;monkey.patch_all()  #补丁
from gevent import spawn
import time


# def task1(name):
#     print(name)
#     print('start')
#     time.sleep(1)
#     print('end')
#
#
# def task2():
#     print('start')
#     time.sleep(3)
#     print('end')
#
#
# def task3():
#     print('start')
#     time.sleep(5)
#     print('end')
#
#
# if __name__ == '__main__':
#     spawn(task1, 'tank')
#     spawn(task2)
#     g = spawn(task3)
#     g.join()

#线程池与进程池

# #进程池
# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
#
# #池子对象:内部帮你提交50个启动进程的任务
# p_pool = ProcessPoolExecutor(50)
#
#
# def task1(n):
#     print(f'from task1...{n}')
#     time.sleep(10)
#
#
# if __name__ == '__main__':
#     n = 1
#     while True:
#         #参数1:函数名
#         #参数2:函数的参数1
#         #参数3:函数的参数2
#         #submit(参数1,参数2, 参数3)
#         p_pool.submit(task1, n)
#         n += 1
#
#         ##注意:还有一个shutdown的用法,是用来关闭进程池以及提交的任务submit的
#
#

# # 线程池
# from concurrent.futures import ThreadPoolExecutor
# import time
# ## 池子对象:内部可以帮你提交50个启动线程的任务
# p_pool =  ThreadPoolExecutor(50)
#
#
# def task1(n):
#     print(f'from task1...{n}')
#     time.sleep(10)
#
#
# if __name__ == '__main__':
#     n = 1
#     while True:
#         p_pool.submit(task1, n)
#         n += 1

#add_done_callback
from concurrent.futures import ThreadPoolExecutor
import time

p_pool = ThreadPoolExecutor(50)


def task1(n):
    print(f'from task1...{n}')
    time.sleep(5)
    return 'yafeng'


def get_result(obj):
    # print(obj.__dict__)
    #print(obj._result)   等同于 print(obj.)
    result = obj.result()
    print(result)



if __name__ == '__main__':
    n = 1
    while True:
        p_pool.submit(task1, n).add_done_callback(get_result)
        n += 1


二、tcp服务端实现协程

  • 演示
- client文件
from threading import Thread, current_thread
import socket

def send_get_msg():
    client = socket.socket()

    client.connect(
        ('127.0.0.1', 9026)
    )

    while True:
        client.send(f'{current_thread().name}'.encode('utf-8'))
        data = client.recv(1024)
        print(data.decode('utf-8'))


if __name__ == '__main__':
    list1 = []
    for line in range(100):
        t = Thread(target=send_get_msg)
        t.start()
        list1.append(t)


    for t in list1:
        t.join()


        
- sever 文件
from gevent import monkey;monkey.patch_all()
from gevent import spawn
import socket

sever = socket.socket()

sever.bind(
    ('127.0.0.1', 9026)
)

sever.listen()

#与客户端通信
def working(coon):
    while True:
        try:
            data = coon.recv(1024)
            if len(data) == 0:
                break

            print(data.decode('utf-8'))

            coon.send(data.upper())

        except Exception as e:
            print(e)
            break
    coon.close()


#与客户端连接
def run(sever):
    while True:
        coon, addr = sever.accept()
        print(addr)
        spawn(working, coon)

if __name__ == '__main__':
    print('服务端已启动...')
    g = spawn(run, sever)
    g.join()

三、数据库安装以及修改配置等操作

  • 理论知识加语法
回顾:
    1、GIL全局解释器锁
        - 优点:
            - 保证了数据安全
            - 因为Cpython中的内存管理员不是线程安全的

        - 缺点:
            - 牺牲了效率,让线程无法实现并行。

    2、协程
        - 进程:资源单位
        - 线程:执行单位
        - 协程:单线程下实现并发

        - 人为模拟多道技术的 切换+保存状态
            - 切换:
                - IO
                - 执行时间长

            - 保存状态:
                - yield

            - gevent模块

数据库:

    - 数据库的介绍:

        1、随意存放在一个文件中的数据,数据的格式千差万别
            tank|123 yafeng:666 reba-666

        2、软件开发规范目录
            - Project:
                - conf
                - bin
                - core
                - db: 存放一个个的文件

        注意:1、2都是从本地读取的文件

        3、将所有的数据存放到一个第三方的公共位置,同一个软件凡是需要操作数据的,就必须去这个共享的位置去获取。

            - 第三方的共享位置(数据库)

            - 数据库集群:将同一个数据库中的数据,复制到不同的服务器中

        4、MySQL数据:  c--->s 架构的软件
            1)mysql数据库本质上就是一个基于网络通信的软件
            2)所有基于网络通信的软件,底层都是socket

            - 服务端:
                - 基于网络通信
                - 收发消息

            - 客户端:
                - 基于网络通信
                - 收发消息

            - 所有语言若想操作数据库,拿到服务端ip和port,都必须遵循一套标准的解析指令


            *******重点:学习sql语句

            - DBMS:数据库管理系统

                - 关系型数据库:MySQL、Oracle、DB2、sqlsever、。。。
                    - 1) 表结构
                        - 需要哪些字段
                        - 字段是什么类型

                    - 2) 字段与字段类型
                        - name --->"tank"--->字符串
                        - age--->17--->整型

                - 非关系型数据库:redis、mongodb...
                    - 非关系型数据库一般以key:value 的形式存储

                    {'naem':'tank'}


     - 安装数据库
        - 1、下载mysql安装包(直接去官网下载最好不要下载最新版本)
        - 2、解压安装包放在你想要放的盘中
        - 3、添加系统环境变量(拷贝bin的地址)
        - 4、以管理员就身份打开cmd,输入mysql启动服务端,此时会卡主
            - mysql初始化是无密码,可以进入游客模式,功能会很少
            - 无密码直接进入--->不需要-p密码
            - bin目录相下的:mysql.exe(想当于客户端)
                           mysqld.exe(相当于服务端)

            全写:mysql -h 127.0.0.1 -p 3306 -p 密码
            简写:mysql -uroot -p 密码

        5、退出数据库客户端
            - exit;
            - quit

        注意:SQL语句末尾必须加“;”号。

        - 查看操作系统中是否已经启动mysql服务端
            - tasklist | findstr "mysql"

        - 杀死mysql进程
            - taskkill /f /pid pid号

        - *******做服务端时,必须先以管理员身份运行

        - 数据库的命令:
            - 查看所有的数据库
                - show databases;

        - 制作系统服务
            - 1、必须将已启动过的服务端的mysql关掉
            - 2、kill掉已启动的mysql的进程
            - 3、输入 mysql --install ---->安装mysql系统服务
            - 4、输入 net start mysql  # 这是打开mysql服务
                      net stop mysql  #这是关闭mysql服务


            mysql -u 登录mysql用户名(一般是root) -p 密码
                - 默认自带 root 超级用户,没有密码
                - 管理员登录
                    - mysql -uroot  回车进入

                - 游客登录
                    - mysql 回车

                - 修改密码:
                    - 默认没有密码的情况下,设置密码
                        - cmd>>>:mysqladmin -uroot password 123

                    - 有密码的情况下,修改密码
                        - cmd>>>:mysqladmin -uroot -p原密码 password你要修改的密码
                        - cmd>>>:mysqladmin _uroot -p123 password 123456

                    - 破解密码:当密码忘记时采用
                        - 1、关闭服务端
                        - 2、跳过权限启动服务端
                            -cmd>>>: mysql --skip-grant-tables

                        - 3、客户端进入游客模式:
                            - cmd>>>: mysql

                            - update mysql库.user表名 set 字段password=字段password('字段值') where 条件(若条件成立,则修改)user=“root”;
                            - cmd>>>: update mysql.user set password= password('123456') where user="root";

                        - 4、重新启动服务端,不要跳过权限认证
                            - 先kill掉跳过权限认证启动的服务端进程
                            - 在手动去开服务服务中的mysql服务即可

                        - 设置配置文件:
                            - 1、先在mysql目录下 ---> 找到你的默认的default配置文件

                            - 2、创建一个名为“my.ini”的文件夹,这是mysql的配置文件
                                 -   [mysqld]
                                     character-set-server=utf8
                                     collation-server=utf8_general_ci

                                    # 这个是用python软件连接的客户端
                                     [client]
                                     default-character-set=utf8


                                    # mysql软件的客户端
                                     [mysql]
                                    # 可写,可不写这样可以不需要用户名与密码直接登录mysql
                                    # user='root'
                                    # password=123

                                    # 设置默认的字符编码
                                     default-character-set=utf8

                            - 3、重启mysql服务,修改成功!

                        数据库的基本操作:
                            - 库的操作 ---> 类似于文件夹
                                - 增:
                                    语法:create database 服务;
                                         create database db1;

                                - 查:
                                    语法:show databases;  #查看所有的库
                                          show create database db1;  #查看db1库中的信息

                                - 改:
                                    语法:alter database 库名 charset="字符编码类型";
                                        - alter database db1 charset="utf8"  # 注意:不能写成“utf-8”

                                - 删
                                    语法:drop database db1;


                            - 表的操作 --->类似于文件
                                -*****注意:操作表前,需要先切换到指定的库擦才可以操作
                                    语法: use 库名;
                                        - use db1;

                                    查看当前所在的库:select database()

                                - 增
                                    varchar 与 char 都是字符串类型
                                    varchar(20)
                                    语法:create table 表名(字段名 字段类型);
                                          create table user_info(name varchar(20), age int);
                                     #此时得先use user_info;才可以增加表名

                                - 改:
                                    语法:alter table 表名 modify name varchar(28);
                                         - alter table user_info modify name varchar(28);

                                - 删:
                                    语法:drop table 表名;
                                        - create table test(id int);
                                        - drop table test;

                            - 表中内容(数据)的操作 --->类似于文件中的一行行数据

                                - 增:
                                    语法:insert into 表名 values('字段类型的数据1', 字段类型的数据1);
                                    # 插入一条:
                                        - insert into user_info values('yafeng', 18);

                                    # 插入多条:
                                        - insert into user_info values('yafeng', 18), ('reba', 17);

                                - 查:
                                    # 注意:* 代表的是所有的意思
                                    语法:select * from 表名;  #查看表中所有的数据
                                        - select * from user_info;

                                    # 查看name 字段为 yafeng 的记录
                                        - select * from 表名 where 条件;  #条件成立则查看成功!
                                        - select *from user_info where name="yafeng";


                                    # 查看name 字段为 yafeng 的age字段
                                        - select age from user_info where name="yafeng";

                                    # 查看所有的名字:
                                        - select name from user_info;


                                - 改
                                    语法: update 表名 set 字段名=字段值 where 条件判断;  # 若条件成立,则修改成功!

                                    # 修改age为17的记录中的name属性为 handsome
                                    - update user_info set name="handsome" where age=17;

                                    # 修改age>16的记录中的记录 中的name属性为 d_sb
                                    - update user_info set name="d_sb" where age>16;

                                - 删

                                    语法:delete from 表名;
                                        # 清空表记录,不提交,可恢复。
                                        - delet from user_info;

                                    语法:truncate table 表名;
                                    #删除,不可恢复
                                    - truncate table user_info;


posted @ 2019-12-10 20:13  alen_zhan  阅读(472)  评论(0编辑  收藏  举报
返回顶部