資料庫 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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...