資料庫 tcp協程實現併發 回調函數

来源:https://www.cnblogs.com/yafeng666/archive/2019/12/10/12018909.html
-Advertisement-
Play Games

資料庫 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;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • import org.apache.spark.rdd.RDDimport org.apache.spark.{Partitioner, SparkConf, SparkContext} object Transformation { def main(args: Array[String]): U ...
  • AQS是JUC包中許多類的實現根基,這篇文章只是個人理解的產物,不免有誤,若閱讀過程中有發現不對的,希望幫忙指出[贊]! 1 AQS內臟圖 ​ 在開始瞭解 之前,我們先從上帝視角看看 是由幾個部分組成的。 ​ 內部維護了一個 修飾的 資源變數 ,裡面的所有操作都可以說跟這個變數有關係,因為它代表的就 ...
  • 出現如下錯誤: 解決辦法: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxshop', 'HOST': '127.0.0.1', 'PORT': '3306', 'USER': 'mxshop' ...
  • 快速排序: 它的基本思想是:通過一躺排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一不部分的所有數據都要小, 然後再按次方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。最壞情況的時 間複雜度為O(n2),最好情況時間複雜度為O(nlog ...
  • 通過對比Dubbo2.6.0,2.7.0,2.7.3版本的源碼,分析Dubbo2.7 非同步化的改造的細節。請大家多多指教。 ...
  • 第一步:爬取分類url 第二步:獲取翻頁 第三步:獲取詳情頁url 第四步:詳情頁訪問 ...
  • python中約到的問題,IndentationError: unindent does not match any outer indentation level占位問題,存在兩種可能性:1.代碼沒有對齊 2.存在非法字元與其他格式的不可見的內容(輸入法的問題) 解決: 1.TAB對齊代碼 2.選 ...
  • 前言 最近在實習,在公司看到前輩的一些代碼,發現有很多值得我學習的地方,其中有一部分就是對集合使用Stream流式操作,覺得很優美且方便。所以學習一些Stream流,在這裡記錄一下。 Stream是什麼 Stream 是Java 8中出現的新特性,極大增強了集合對象的功能,專註於對集合對象進行方便、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...