資料庫 tcp協程實現併發 回顧 一、回顧 進程池,線程池,回調函數 二、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;