浅析python多线程及ThreadPoolExecutor的使用及问题

本文通过对比直接创建线程、使用线程池以及单线程读取Excel数据,发现单线程在某些情况下效率高于多线程。深入探讨了Python中的全局解释器锁(GIL),解释了GIL如何限制了多线程在CPU密集型任务中的性能,并建议使用多进程来规避这一问题。
摘要由CSDN通过智能技术生成

首先上一个多线程获取多个excel数据为dataFrame的例子

前言:

本此测试数据为120个excel文件,每个文件1000条数据,共120000条数据需要读取

直接创建线程与使用线程池对比

1. 直接依任务数创建线程
# @datetime:6/27/0027
"desc"
__author__ = "hanyaning@deri.energy"
import threading
import os.path
import time
from service import logger
import pandas as pd

logger = logger.MyLogger("multi_thread").getLogger()
# 定义全局变量,用于每个线程存放data
data = []


# 自定义线程类,继承threading.Thread
class MyThread(threading.Thread):
    def __init__(self, name, path):
        threading.Thread.__init__(self)
        # 线程名
        self.name = name
        # 线程执行任务所需数据定义,这里是excel路径
        self.path = path

    # run方法,执行线程start方法后会自动调用这个run方法,用于调用getExcelData并将值传给data
    def run(self):
        global data
        path = self.path
        data.append(getExcelData(path))


def getExcelData(path):
    logger.info("开始读取excel,当前线程:" + str(threading.currentThread().name))
    data = pd.DataFrame()
    if not os.path.exists(path):
        raise FileNotFoundError()
    if os.path.isfile(path):
        logger.info("读取Excel文件完毕,当前线程:" + str(threading.currentThread().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值