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

一、补充

  • 进程池,线程池,回调函数
  1. # from gevent import monkey;monkey.patch_all() #补丁
  2. from gevent import spawn
  3. import time
  4. # def task1(name):
  5. # print(name)
  6. # print('start')
  7. # time.sleep(1)
  8. # print('end')
  9. #
  10. #
  11. # def task2():
  12. # print('start')
  13. # time.sleep(3)
  14. # print('end')
  15. #
  16. #
  17. # def task3():
  18. # print('start')
  19. # time.sleep(5)
  20. # print('end')
  21. #
  22. #
  23. # if __name__ == '__main__':
  24. # spawn(task1, 'tank')
  25. # spawn(task2)
  26. # g = spawn(task3)
  27. # g.join()
  28. #线程池与进程池
  29. # #进程池
  30. # from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
  31. #
  32. # #池子对象:内部帮你提交50个启动进程的任务
  33. # p_pool = ProcessPoolExecutor(50)
  34. #
  35. #
  36. # def task1(n):
  37. # print(f'from task1...{n}')
  38. # time.sleep(10)
  39. #
  40. #
  41. # if __name__ == '__main__':
  42. # n = 1
  43. # while True:
  44. # #参数1:函数名
  45. # #参数2:函数的参数1
  46. # #参数3:函数的参数2
  47. # #submit(参数1,参数2, 参数3)
  48. # p_pool.submit(task1, n)
  49. # n += 1
  50. #
  51. # ##注意:还有一个shutdown的用法,是用来关闭进程池以及提交的任务submit的
  52. #
  53. #
  54. # # 线程池
  55. # from concurrent.futures import ThreadPoolExecutor
  56. # import time
  57. # ## 池子对象:内部可以帮你提交50个启动线程的任务
  58. # p_pool = ThreadPoolExecutor(50)
  59. #
  60. #
  61. # def task1(n):
  62. # print(f'from task1...{n}')
  63. # time.sleep(10)
  64. #
  65. #
  66. # if __name__ == '__main__':
  67. # n = 1
  68. # while True:
  69. # p_pool.submit(task1, n)
  70. # n += 1
  71. #add_done_callback
  72. from concurrent.futures import ThreadPoolExecutor
  73. import time
  74. p_pool = ThreadPoolExecutor(50)
  75. def task1(n):
  76. print(f'from task1...{n}')
  77. time.sleep(5)
  78. return 'yafeng'
  79. def get_result(obj):
  80. # print(obj.__dict__)
  81. #print(obj._result) 等同于 print(obj.)
  82. result = obj.result()
  83. print(result)
  84. if __name__ == '__main__':
  85. n = 1
  86. while True:
  87. p_pool.submit(task1, n).add_done_callback(get_result)
  88. n += 1

二、tcp服务端实现协程

  • 演示
  1. - client文件
  2. from threading import Thread, current_thread
  3. import socket
  4. def send_get_msg():
  5. client = socket.socket()
  6. client.connect(
  7. ('127.0.0.1', 9026)
  8. )
  9. while True:
  10. client.send(f'{current_thread().name}'.encode('utf-8'))
  11. data = client.recv(1024)
  12. print(data.decode('utf-8'))
  13. if __name__ == '__main__':
  14. list1 = []
  15. for line in range(100):
  16. t = Thread(target=send_get_msg)
  17. t.start()
  18. list1.append(t)
  19. for t in list1:
  20. t.join()
  21. - sever 文件
  22. from gevent import monkey;monkey.patch_all()
  23. from gevent import spawn
  24. import socket
  25. sever = socket.socket()
  26. sever.bind(
  27. ('127.0.0.1', 9026)
  28. )
  29. sever.listen()
  30. #与客户端通信
  31. def working(coon):
  32. while True:
  33. try:
  34. data = coon.recv(1024)
  35. if len(data) == 0:
  36. break
  37. print(data.decode('utf-8'))
  38. coon.send(data.upper())
  39. except Exception as e:
  40. print(e)
  41. break
  42. coon.close()
  43. #与客户端连接
  44. def run(sever):
  45. while True:
  46. coon, addr = sever.accept()
  47. print(addr)
  48. spawn(working, coon)
  49. if __name__ == '__main__':
  50. print('服务端已启动...')
  51. g = spawn(run, sever)
  52. g.join()

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

  • 理论知识加语法
  1. 回顾:
  2. 1GIL全局解释器锁
  3. - 优点:
  4. - 保证了数据安全
  5. - 因为Cpython中的内存管理员不是线程安全的
  6. - 缺点:
  7. - 牺牲了效率,让线程无法实现并行。
  8. 2、协程
  9. - 进程:资源单位
  10. - 线程:执行单位
  11. - 协程:单线程下实现并发
  12. - 人为模拟多道技术的 切换+保存状态
  13. - 切换:
  14. - IO
  15. - 执行时间长
  16. - 保存状态:
  17. - yield
  18. - gevent模块
  19. 数据库:
  20. - 数据库的介绍:
  21. 1、随意存放在一个文件中的数据,数据的格式千差万别
  22. tank|123 yafeng:666 reba-666
  23. 2、软件开发规范目录
  24. - Project:
  25. - conf
  26. - bin
  27. - core
  28. - db: 存放一个个的文件
  29. 注意:12都是从本地读取的文件
  30. 3、将所有的数据存放到一个第三方的公共位置,同一个软件凡是需要操作数据的,就必须去这个共享的位置去获取。
  31. - 第三方的共享位置(数据库)
  32. - 数据库集群:将同一个数据库中的数据,复制到不同的服务器中
  33. 4MySQL数据: c--->s 架构的软件
  34. 1mysql数据库本质上就是一个基于网络通信的软件
  35. 2)所有基于网络通信的软件,底层都是socket
  36. - 服务端:
  37. - 基于网络通信
  38. - 收发消息
  39. - 客户端:
  40. - 基于网络通信
  41. - 收发消息
  42. - 所有语言若想操作数据库,拿到服务端ipport,都必须遵循一套标准的解析指令
  43. *******重点:学习sql语句
  44. - DBMS:数据库管理系统
  45. - 关系型数据库:MySQLOracleDB2sqlsever、。。。
  46. - 1 表结构
  47. - 需要哪些字段
  48. - 字段是什么类型
  49. - 2 字段与字段类型
  50. - name --->"tank"--->字符串
  51. - age--->17--->整型
  52. - 非关系型数据库:redismongodb...
  53. - 非关系型数据库一般以key:value 的形式存储
  54. {'naem':'tank'}
  55. - 安装数据库
  56. - 1、下载mysql安装包(直接去官网下载最好不要下载最新版本)
  57. - 2、解压安装包放在你想要放的盘中
  58. - 3、添加系统环境变量(拷贝bin的地址)
  59. - 4、以管理员就身份打开cmd,输入mysql启动服务端,此时会卡主
  60. - mysql初始化是无密码,可以进入游客模式,功能会很少
  61. - 无密码直接进入--->不需要-p密码
  62. - bin目录相下的:mysql.exe(想当于客户端)
  63. mysqld.exe(相当于服务端)
  64. 全写:mysql -h 127.0.0.1 -p 3306 -p 密码
  65. 简写:mysql -uroot -p 密码
  66. 5、退出数据库客户端
  67. - exit
  68. - quit
  69. 注意:SQL语句末尾必须加“;”号。
  70. - 查看操作系统中是否已经启动mysql服务端
  71. - tasklist | findstr "mysql"
  72. - 杀死mysql进程
  73. - taskkill /f /pid pid
  74. - *******做服务端时,必须先以管理员身份运行
  75. - 数据库的命令:
  76. - 查看所有的数据库
  77. - show databases;
  78. - 制作系统服务
  79. - 1、必须将已启动过的服务端的mysql关掉
  80. - 2kill掉已启动的mysql的进程
  81. - 3、输入 mysql --install ---->安装mysql系统服务
  82. - 4、输入 net start mysql # 这是打开mysql服务
  83. net stop mysql #这是关闭mysql服务
  84. mysql -u 登录mysql用户名(一般是root -p 密码
  85. - 默认自带 root 超级用户,没有密码
  86. - 管理员登录
  87. - mysql -uroot 回车进入
  88. - 游客登录
  89. - mysql 回车
  90. - 修改密码:
  91. - 默认没有密码的情况下,设置密码
  92. - cmd>>>:mysqladmin -uroot password 123
  93. - 有密码的情况下,修改密码
  94. - cmd>>>:mysqladmin -uroot -p原密码 password你要修改的密码
  95. - cmd>>>:mysqladmin _uroot -p123 password 123456
  96. - 破解密码:当密码忘记时采用
  97. - 1、关闭服务端
  98. - 2、跳过权限启动服务端
  99. -cmd>>>: mysql --skip-grant-tables
  100. - 3、客户端进入游客模式:
  101. - cmd>>>: mysql
  102. - update mysql库.user表名 set 字段password=字段password'字段值' where 条件(若条件成立,则修改)user=“root”;
  103. - cmd>>>: update mysql.user set password= password('123456') where user="root";
  104. - 4、重新启动服务端,不要跳过权限认证
  105. - kill掉跳过权限认证启动的服务端进程
  106. - 在手动去开服务服务中的mysql服务即可
  107. - 设置配置文件:
  108. - 1、先在mysql目录下 ---> 找到你的默认的default配置文件
  109. - 2、创建一个名为“my.ini”的文件夹,这是mysql的配置文件
  110. - [mysqld]
  111. character-set-server=utf8
  112. collation-server=utf8_general_ci
  113. # 这个是用python软件连接的客户端
  114. [client]
  115. default-character-set=utf8
  116. # mysql软件的客户端
  117. [mysql]
  118. # 可写,可不写这样可以不需要用户名与密码直接登录mysql
  119. # user='root'
  120. # password=123
  121. # 设置默认的字符编码
  122. default-character-set=utf8
  123. - 3、重启mysql服务,修改成功!
  124. 数据库的基本操作:
  125. - 库的操作 ---> 类似于文件夹
  126. - 增:
  127. 语法:create database 服务;
  128. create database db1;
  129. - 查:
  130. 语法:show databases; #查看所有的库
  131. show create database db1; #查看db1库中的信息
  132. - 改:
  133. 语法:alter database 库名 charset="字符编码类型";
  134. - alter database db1 charset="utf8" # 注意:不能写成“utf-8”
  135. -
  136. 语法:drop database db1;
  137. - 表的操作 --->类似于文件
  138. -*****注意:操作表前,需要先切换到指定的库擦才可以操作
  139. 语法: use 库名;
  140. - use db1;
  141. 查看当前所在的库:select database()
  142. -
  143. varchar char 都是字符串类型
  144. varchar(20)
  145. 语法:create table 表名(字段名 字段类型);
  146. create table user_info(name varchar(20), age int);
  147. #此时得先use user_info;才可以增加表名
  148. - 改:
  149. 语法:alter table 表名 modify name varchar(28);
  150. - alter table user_info modify name varchar(28);
  151. - 删:
  152. 语法:drop table 表名;
  153. - create table test(id int);
  154. - drop table test;
  155. - 表中内容(数据)的操作 --->类似于文件中的一行行数据
  156. - 增:
  157. 语法:insert into 表名 values'字段类型的数据1', 字段类型的数据1);
  158. # 插入一条:
  159. - insert into user_info values('yafeng', 18);
  160. # 插入多条:
  161. - insert into user_info values('yafeng', 18), ('reba', 17);
  162. - 查:
  163. # 注意:* 代表的是所有的意思
  164. 语法:select * from 表名; #查看表中所有的数据
  165. - select * from user_info;
  166. # 查看name 字段为 yafeng 的记录
  167. - select * from 表名 where 条件; #条件成立则查看成功!
  168. - select *from user_info where name="yafeng";
  169. # 查看name 字段为 yafeng 的age字段
  170. - select age from user_info where name="yafeng";
  171. # 查看所有的名字:
  172. - select name from user_info;
  173. -
  174. 语法: update 表名 set 字段名=字段值 where 条件判断; # 若条件成立,则修改成功!
  175. # 修改age为17的记录中的name属性为 handsome
  176. - update user_info set name="handsome" where age=17;
  177. # 修改age>16的记录中的记录 中的name属性为 d_sb
  178. - update user_info set name="d_sb" where age>16;
  179. -
  180. 语法:delete from 表名;
  181. # 清空表记录,不提交,可恢复。
  182. - delet from user_info
  183. 语法:truncate table 表名;
  184. #删除,不可恢复
  185. - truncate table user_info;

数据库 tcp协程实现并发 回调函数的更多相关文章

  1. Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端

    TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...

  2. 11.python3标准库--使用进程、线程和协程提供并发性

    ''' python提供了一些复杂的工具用于管理使用进程和线程的并发操作. 通过应用这些计数,使用这些模块并发地运行作业的各个部分,即便是一些相当简单的程序也可以更快的运行 subprocess提供了 ...

  3. 理解Go协程与并发

    协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) fun ...

  4. 理解Go协程与并发(转)

    理解Go协程与并发   协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: Copy package main import ( "fmt" " ...

  5. asyncio协程与并发

    并发编程 Python的并发实现有三种方法. 多线程 多进程 协程(生成器) 基本概念 串行:同时只能执行单个任务 并行:同时执行多个任务 在Python中,虽然严格说来多线程与协程都是串行的,但其效 ...

  6. python教程:使用 async 和 await 协程进行并发编程

    python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程. 而近几个版本,python ...

  7. 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异

    今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...

  8. Day 42 协程. IO 并发

    一.什么是协程? 是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程切换效率更快了. ...

  9. 协程基础_context系列函数

    近期想看看协程,对这个的详细实现不太了解.查了下,协程最常规的做法就是基于makecontext,getcontext,swapcontext这类函数在用户空间切换用户上下文. 所以在这通过样例代码尽 ...

随机推荐

  1. 2018HDU多校训练-3-Problem M. Walking Plan

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6331 Walking Plan  Problem Description There are n inte ...

  2. todo demo

    Todo 功能实现 https://rencoo.github.io/appDemo/todo/index.html ---1.添加事项 ---2.置顶事项 ---3.删除事项 ---4.用时排序 - ...

  3. 联合查询和数据库设计e-r图

    联合查询: 联合查询的关键字是: union 基本含义 联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”. 两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等. 就 ...

  4. 【系列专题】JavaScript设计模式 重温系列(9篇全)

    JavaScript 设计模式 [JS]164-JavaScript设计模式--单体模式 [JS]165-JavaScript设计模式--工厂模式 [JS]166-JavaScript设计模式--迭代 ...

  5. 【算法】273-每周一练 之 数据结构与算法(Tree)

    这是第六周的练习题,最近加班比较多. 下面是之前分享的链接: [算法]200-每周一练 之 数据结构与算法(Stack) [算法]213-每周一练 之 数据结构与算法(LinkedList) [算法] ...

  6. JS-常见数据结构

    常见数据结构 这一章节我们将来学习数据结构的内容.经常会有人提问说:学习数据结构或者算法对于前端工程师有用么? 总的来说,这些基础学科在短期内收效确实甚微,但是我们首先不要将自己局限在前端工程师这点上 ...

  7. Mock接口依赖的使用

    mock 能做什么 1.前后端联调,如果你是一个前端页面开发,现在需要开发一个功能:下一个订单,支付页面的接口,根据支付结果,支付成功,展示支付成功页,支付失败,展示支付失败页.要完成此功能,你需要 ...

  8. 常见的web安全问题总结

    we安全对于web前端从事人员也是一个特别重要的一个知识点,也是面试的时候,面试官经常问的安全前端问题.掌握一些web安全知识,提供安全防范意识,今天就会从几个方面说起前端web攻击和防御的常用手段 ...

  9. 《Android项目实战--手机安全卫士》读后感

    上学期在学校图书馆看到此书,觉得比较贴近实践,于是寒假研究了一番,也算是体会了一把社会培训机构的模式. 由于时间关系,最后两章还没弄完,但感觉每章节的流程相似,加之马上要回学校了,所以打算在家的最后一 ...

  10. 为什么要使用Unix时间戳

    概念: UNIX时间戳:Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是从1970年1月1日(UTC/GMT的午夜)开始 ...