• 数据库 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;
    
    
    
  • 相关阅读:
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Python long() 函数
    Python int() 函数
    Python 变量类型
    Python 基础语法
    Python 中文编码
    深度学习点云语义分割:CVPR2019论文阅读
    自动泊车技术短暂困境,前景可期
    深度学习网络模型压缩剪枝详细分析
    用OpenCV4实现图像的超分别率
  • 原文地址:https://www.cnblogs.com/yafeng666/p/12018909.html
Copyright © 2020-2023  润新知