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

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

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


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

更多相關文章
  • 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中出現的新特性,極大增強了集合對象的功能,專註於對集合對象進行方便、 ...
一周排行
  • " 返回《C 併發編程》" "1. 概念介紹" "2. 非同步編程" "2.1. async運行過程" "2.2. async運行中同步上下文簡介" "2.3. 創建Task實例" "2.4. 捕獲非同步異常類型" "3. 並行編程" "3.1. Parallel" "3.2. 異常處理" "3.3. ...
  • 我們先看看兩個特效,感受一下,有沒有學習的動力? 核心API:Texture2D.SetPixel(int x, int y, Color color),Texture2D.Apply() 實現原理:對象池 思路: 第一幀繪製前:遍歷瓦片上所有活著的粒子對象並且進行數據操作(或運動,死亡),發生運動 ...
  • 原來的導出方式比較適用於比較簡單的導出,每一條數據在一行,數據列雖然自定義程度比較高,如果要一條數據對應多行就做不到了,於是就想支持根據模板導出,在 1.8.0 版本中引入了根據模板導出的功能 ...
  • 創建一個bat腳本, 裡面寫上: reg delete HKEY_CURRENT_USER\Software\JetBrains\dotMemory /freg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ex ...
  • Linux下有vsyscall來優化一些例如time(NULL), gettimeofday這種調用的消耗; 但是Windows下, 沒有類似的東西, 但是思路還是有的 1. 程式啟動的時候, 獲取一下準確的時間戳 2. 然後每次需要獲取時間的時候, 獲取一下流逝的時間, 可以通過獲取CPU的tic ...
  • 當用戶按下鍵盤上的一個鍵時,就會發生一系列事件。下表根據他們的發生順序列出了這些事件: 表 所有元素的鍵盤事件(按順序) 鍵盤處理永遠不會像上面看到的這麼簡單。一些控制項可能會掛起這些事件中的某些事件,從而可執行自己更特殊的鍵盤處理。最明顯的例子是TextBox控制項,它掛起了TextInput事件。對 ...
  • static void LocalMethod() { Cube(100); void Cube(int x) => Console.WriteLine($"The cube of {x} is {x * x * x}"); } static void GoToDemo() { int i = 1; ...
  • 滑鼠事件執行幾個關聯的任務。當滑鼠移到某個元素上時,可通過最基本的滑鼠事件進行響應。這些事件是MouseEnter(當滑鼠指針移到元素上時引發該事件)和MouseLeave(當滑鼠指針離開元素時引發該事件)。這兩個事件都是直接事件,這意味著他們不使用冒泡和隧道過程,而是源自一個元素並且只被該元素引發 ...
  • 反射這個詞聽起來就很牛逼是吧? 嗯的確,反射是比較高級的特性,只有語言基礎很扎實的Dev們才應該使用它。 搞點反射,可以提高程式的靈活性、可擴展性、耦合度。 反射這東西,是為了動態地運行時載入,相比於靜態代碼。編譯的時候就是板上釘釘了。 就是說,如果你的程式需要在運行時搞一些晚綁定,動態載入或檢查對 ...
  • 眾所周知,微服務架構是由一眾微服務組成,項目中調用其他微服務介面更是常見的操作。為了便於調用外部介面,我們的常用思路一般都是封裝一個外部介面的客戶端,使用時候直接調用相應的方法。webservice或WCF的做法就是引用服務,自動生成客戶端。在webapi2.0里,我們都會手動封裝一個靜態類。那麼在 ...
x