遇到問題: 數據庫里的數據要都跑一遍,全拿出來會卡爆緩存,還有一種是跑一個刪一個。不行數據還要呢,或則復制一份,跑一個刪一個。還是不行麻煩。
理想狀況:可以分批次取,一次取多少,記錄下當前值。以后可以從當前值 ,接着取。
`limit n,m`,表示起始值為n,然后取出m個記錄。如果batch size為25,那么可以:
`limit 25`,`limit 25,25`,limit`50,25` ... 依次下去,默認按照表的主鍵id升序排列,每次記錄最大的已處理記錄的主鍵id(這里基於了一個假設,此表是自增主鍵)
如果此表沒有新增記錄,以上方法肯定沒問題,但是如果此表有多個事務並發寫入,可能會導致大id記錄先於小id記錄(兩個事務)被處理,導致這部分小id記錄永遠也不會被處理到。
問題中使用`post_date`其實也會有這個問題,無法保證`post_date`小的數據記錄一定先於`post_date`大的記錄先入庫。insert時間早,id小的記錄並不一定早於id大的記錄插入至數據庫。此完全取決於事務的提交時間。
具體使用過程
import multiprocessing
def func(start, end):
ip_list = MySql.xxxxxxxx(start, end) # 126000
print(ip_list)
token, c = get_token()
for ip in ip_list:
# time.sleep(random.random()*10)
get_tuan_info(token, c, ip)
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=10) # 創建4個進程
results = []
for msg in range(0, 10000, 1000):
msg += 0
results.append(pool.apply_async(func, (msg, 1000)))
pool.close() # 關閉進程池,表示不能再往進程池中添加進程,需要在join之前調用
pool.join() # 等待進程池中的所有進程執行完畢