脚本内容
因为要读取mongo某个全表数据(亿级别),有个字段有索引且是一堆多的关系
从其他表读取所有这个字段(十万级别),再读取大表
因为数据量大所以写个测试,从中拿出几条去大表查询(每次读到十万级别数据)
多线程和多进程的影响
不使用多线/进程
file = open('test2.csv', 'w')
content = csv.writer(file)
station_ids = ['1', '2', '3', '4', '5', '6', '7', '8']
for station_id in station_ids:
result = get_xxx_by_station_id(station_id)
content.writerow(result)
file.close()
# 最后执行时间74.20422029495239
多线程
# 测试代码段
file = open('test2.csv', 'w')
content = csv.writer(file)
station_ids = ['1', '2', '3', '4', '5', '6', '7', '8']
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as exector:
for nums in range(0, 7, 5):
all_result = []
for idx in range(nums, nums + 5):
if idx > 7: break
result = exector.submit(get_xxx_by_station_id,station_ids[idx])
all_result.append(result)
for one_result in concurrent.futures.as_completed(all_result):
content.writerow(one_result.result())
file.close()
# 最后执行时间29.21958827972412
多进程
# 测试代码段
file = open('test2.csv', 'w')
content = csv.writer(file)
station_ids = ['1', '2', '3', '4', '5', '6', '7', '8']
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as exector:
for nums in range(0, 7, 5):
all_result = []
for idx in range(nums, nums + 5):
if idx > 7: break
result = exector.submit(get_xxx_by_station_id,station_ids[idx])
all_result.append(result)
for one_result in concurrent.futures.as_completed(all_result):
content.writerow(one_result.result())
file.close()
# 最后执行时间30.441758632659912
思考
对于脚本我想应该是多次向数据库发送查询请求,数据库那边获取数据时间比较长,如果不用多进程/线程的话,脚本这边一直处于等待的等到数据返回回来的时候再次发送下次的查询请求
而对于多线程和多进程对于脚本的影响是一样的或者多线程会更快一点的原因应该是向数据库发送请求应该是io请求,对于cpu使用不大,所以多进程应该发挥不出很大作用(这块没有考虑python内置GIL锁的情况)