lsekfe 发表于 2023-3-7 11:02:09

并发导致功能接口查询结果与原始数据差别大的原因

案情描述
  收到这么一个需求:存在一个数据库查询功能接口,需要完成1000个条件语句的查询,并将查询结果与原始数据库(如es)的查询结果对比,从而判定该功能接口是否正常,且正确可用。
  第一次测试设计:读取文件中的1000个查询条件,顺序执行。但由于查询数据量较大,单线程顺序完成1000次查询耗时较长,效率太低——抛弃;
  第二次测试设计:使用并发查询,多线程并发提高工作效率,节省了大大的时间。但将输出的1000个查询结果与原始数据库查询结果对比时,发现某些语句差异较大,为什么?
  抽丝剥茧
  为何功能接口查询结果与原始数据查询结果差异性大?
  经过排查,问题出在查询语句对比时匹配错位——使用简单并发查询,输出并不严格按照读入顺序。换句话说:读入1、2、3、4、5个顺序查询条件,并发查询输出顺序可能时2、1、3、4、5,也可能时4、5、2、1、3。
  那么,如何在编写测试脚本时,让并发输出严格按照读入顺序输出呢?
  亡羊补牢
  从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,可以帮助我们更好地完成并发设计。
  本文我们不过深地讲述如何使用这些Python类,只简单讲述如何解答我们的核心问题——“如何在并发时让结果严格按照输入顺序输出”。
  线程池ThreadPoolExecutor
  如下所示,为ThreadPoolExecutor的基本使用方法,打印输入的list列表中的数字。
  ThreadPoolExecutor()初始化,创建线程池,最多2个线程并发运行,通过submit调用子函数(打印输入数字),最终通过as_completed等待所有任务完成后,通过result收集返回结果。
# -*-coding:utf-8 -*-
from concurrent.futures import ThreadPoolExecutor,as_completed

# 子函数,打印输入数字
def print_num(num):
    return num

list =

##############使用ThreadPoolExecutor###################
###############并发执行,非顺序返回################
# 创建线程池子
# 设置最多2个线程运行,其他等待
executor = ThreadPoolExecutor(max_workers=2)
all_task =
result2_list = []
for future in as_completed(all_task):
    data = future.result()
    result2_list.append(data)
print("并发执行,非顺序返回:"+ str(result2_list))
##############################################



页: [1]
查看完整版本: 并发导致功能接口查询结果与原始数据差别大的原因