python 協程 在批量插入時候的無能為力

2021-08-13 18:00:54 字數 2667 閱讀 2524

需要壓力測試需要新增至少500萬的使用者還有相關資訊,目前只操作3各表,插入速度太慢了,插入一萬條資料就需要30分鐘左右。然後就想到很多辦法去優化。首先想到了協程。

首先,協程就是解決併發問題的,插入語句是一種io流操作,想著遇到io流阻塞就會切換這樣插入的快一點

實驗結果表明和不用協程實現插入時間上面區別不大

python 使用協程的程式如下

def

add_user

(self, number=10):

gevent_list = [gevent.spawn(self.gevent_add_user_test, number) for i in range(2)]

gevent.joinall(gevent_list)

cellphone = 10000000000

defgevent_add_user_test

(self, number):

global cellphone

# identity_card = 100000000000000000

user_query = self.user.get_query()

user_query = self.user.order_by_id_desc(user_query)

user_obj = operation.first(user_query)

if user_obj:

if user_obj.cellphone:

cellphone = int(user_obj.cellphone)

i = 0

while i <= number:

# ohholog.print_log(i)

i += 1

cellphone += 1

while self.user.get_by_cellphone(str(cellphone)):

cellphone = cellphone + 1

user_id = self.add_user_table(str(cellphone))

self.add_user_token_table(user_id)

self.add_user_extension(user_id)

print("for end")

print("end")

沒有使用協程的**:

def

add_user1

(self, number=10):

cellphone = 10000000000

# identity_card = 100000000000000000

user_query = self.user.get_query()

user_query = self.user.order_by_id_desc(user_query)

user_obj = operation.first(user_query)

if user_obj:

if user_obj.cellphone:

cellphone = int(user_obj.cellphone)

i = 0

while i <= number:

i += 1

cellphone += 1

while self.user.get_by_cellphone(str(cellphone)):

cellphone = cellphone + 1

user_id = self.add_user_table(str(cellphone))

self.add_user_token_table(user_id)

self.add_user_extension(user_id)

print("for end")

print("end")

使用直接插入的** 結果用時5.6149分鐘 使用協程5.920分鐘

對於向資料庫裡面插入,瓶頸不是在於程式而是 資料庫的大量插入,現在這樣說還是為使過早,還有一邊文章會比較優化程式後的插入時間。

協程的應用場景不是向資料庫讀寫等,是訪問

在爬取不通的**時候併發爬取

像這樣

from gevent import monkey; monkey.patch_all()

import gevent

import urllib2

deff

(url):

print('get: %s' % url)

resp = urllib2.urlopen(url)

data = resp.read()

print('%d bytes received from %s.' % (len(data), url))

gevent.joinall([

gevent.spawn(f, ''),

gevent.spawn(f, ''),

gevent.spawn(f, ''),

])# 結果

get:

get:

get:

45661 bytes received from .

14823 bytes received from .

304034 bytes received from .

本章主要總結協程的應用場景

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

python 併發程式設計 協程 協程介紹

協程 是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的 需要強調的是 1.python的執行緒屬於核心級別的,即由作業系統控制排程 如單執行緒遇到io或執行時間過長就會被迫交出cpu執行許可...