python 线程池ThreadPoolExecutor

背景

最近项目中需要抽取数据库中某些数据组成一个缓存表,SQL倒是不复杂就是单纯的慢,慢到navicat跑崩了也没跑出来,然后就想着用python写脚本,根据时间字段做异步查询

代码

数据库连接写成伪码,过程抽象一下就是这样

import time
import pandas as pd
from concurrent.futures import ThreadPoolExecutor

# 需要保存的字段,sql中已查询
FIELDS = ["FIELDS_1",
          "FIELDS_2",
          "FIELDS_3",
          "FIELDS_4"
          "FIELDS_5"]
executor = ThreadPoolExecutor(max_workers=8)
df = pd.DataFrame(columns=FIELDS)


def get_data(i):
    # 创建oracle连接
    # 根据参数i,用时间参数format执行的sql
    # 执行sql并获取结果
    time.sleep(6)
    return [{"data": "data"}], i


def save_data(future):
    # 用pandas写入.xlsx格式文件中
    print("保存第{}组数据".format(future[1]))
    global df
    df = df.append(pd.DataFrame(data=future[0], columns=FIELDS))
    time.sleep(1)


def run():
    for i in range(100):
        future = executor.submit(get_data, i)
        # future.result()
        future.add_done_callback(save_data)


if __name__ == '__main__':
    run()
    executor.shutdown(wait=True)
    df.to_excel(SAVE_PATH)

线程池关闭

通过shutdown方法,可以等待线程池内任务结束,并且优雅的关闭线程池,避免了子线程还没跑完,主线程执行完了要退出然后就都一起退出了的尴尬

子线程结果获取

子线程的结果其实可以通过submit返回的future.result()方法来直接获取,但是那样会造成主线程阻塞,所以还是用future.add_done_callback()方法通过回调函数来处理结果。

回调函数传参

回调函数只支持一个参数future,所以执行过程中的其他参数需要通过submit提交时传到子线程的执行函数,然后通过返回参数,让回调函数入参

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值