数据库 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;

数据库 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. iOS开发笔试面试- KVC/KVO简单使用

    转自:http://my.oschina.net/caijunrong/blog/510701 一.对于KVC模式(Key Value Coding): 1.其实在实际开发中用得比较多得就是:接收到j ...

  2. Java修炼——四种方式解析XML_SAX

    四种方式解析XML:DOM      JDOM    DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...

  3. HTML_body中常用的标签部分

    meta: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  4. CodeForces-508A~D篇 div.2

    链接:https://codeforc.es/contest/1038 A题: #include<bits/stdc++.h> using namespace std; typedef l ...

  5. 使用iCamera 测试MT9F002 1400w高分辨率摄像头小结 之!!看清细节!!!

    使用iCamera 测试MT9F002 1400w高分辨率摄像头小结 之!!看清细节!!! 本方案测试两种种分辨率输出(其他更多分辨率设置,可以参考手册配置) 4608*3288=1515万像素 11 ...

  6. DefinePlugin插件用法

    作者:水涛 座右铭:天行健,君子以自强不息 自白:我写博文上来蹭蹭就是干,我突然觉得我需要幽默一点了,好了,下面我们说正经的 一.官方定义: DefinePlugin DefinePlugin 允许创 ...

  7. CCF-CSP题解 201512-3 画图

    画图时思路应该清晰一点.我是将坐标\((x,y)\)映射到\(canvas[y][x]\)上. 连线注意\(+\)号的情况,填充写好\(dfs\)就好了. #include <bits/stdc ...

  8. uni-app自定义app端的扫码界面

    记得当时是在西班牙有这样的一个需求,需要自定义扫码页面,还需要加上西班牙文,当时是在一个组件里面找到了这样的一个方法,全文大部分使用的app端的Native里面的方法,记录一下,跑路了项目代码要删库了 ...

  9. Wonder第一期3D引擎和编辑器线下培训班报名开始啦(免费学习)

    Wonder第一次举办 针对3D底层技术的 线下培训班,免费学习,请大家多多支持-感谢- 培训地点 成都 开课时间 报名满5人开课. 报名方式 加QQ群:732861508 备注请写:报名培训 老师介 ...

  10. Day01-基础数据类型/用户交互/流程控制之-if

    1.基础数据类型 什么是数据类型 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,“汉”是文字,否则它是分不清1和‘ ...