資料庫 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中出現的新特性,極大增強了集合對象的功能,專註於對集合對象進行方便、 ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...