遇到问题: 数据库里的数据要都跑一遍,全拿出来会卡爆缓存,还有一种是跑一个删一个。不行数据还要呢,或则复制一份,跑一个删一个。还是不行麻烦。
理想状况:可以分批次取,一次取多少,记录下当前值。以后可以从当前值 ,接着取。
`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() # 等待进程池中的所有进程执行完毕