使用多线程优化复杂逻辑以及数据量多处理

在做一个数据分析的一个项目 有大量的数据分析处理,逻辑复杂,导致响应速度很慢。3分钟。。。。。。这怎么可能容忍话不多说,多线程搞起(这里就不说多线程优缺点,只是记录一下下次使用方便)

一开始我使用的 三个线程代码如下

 latch = new CountDownLatch(3);
        long startTime = System.currentTimeMillis();

        List<DetailDataDto> demandInputDtoPageInfo = listDetailDataByDate(conditionVo);

        class HeadIn implements Runnable {
            @Override
            public void run() {
                demandInputDtoPageInfo.parallelStream().forEach(s -> {
                    s.setCheckTime(basicInfoMapper.getCreateTime(s.getRequirementNO()));

                });

                latch.countDown();
            }
        }
        class AllIn implements Runnable {

            @Override
            public void run() {
                demandInputDtoPageInfo.parallelStream().forEach(s -> {
                    s.setEndTime(demandInputMapper.getEndTime(s.getRequirementNO()));
                });
                latch.countDown();
            }
        }
        class HeadNotIn implements Runnable {

            @Override
            public void run() {
                demandInputDtoPageInfo.parallelStream().forEach(s -> {
                    s.setDeployTime(basicInfoMapper.getDeployTime(s.getRequirementNO()));
                });
                latch.countDown();

            }
        }

 Thread myThread1 = new Thread(new HeadIn());
                    myThread1.start();
                    Thread myThread2 = new Thread(new AllIn());
                    myThread2.start();
                    Thread myThread3 = new Thread(new HeadNotIn());
                    myThread3.start();
                    latch.await();
//等待线程结束后执行最后逻辑 

这样有些优化 快来一分钟  但是还不能忍受 没事接着来 百度各种搜,完了 忘了原地址了 抱歉(…………)

于是就有下面的东西

   class Task implements Callable<List<DetailDataDto>> {

            private List<DetailDataDto> list;
            private int start;
            private int end;

            public Task(List<DetailDataDto> list, int start, int end) {
                this.list = list;
                this.start = start;
                this.end = end;
            }

            @Override
            public List<DetailDataDto> call() throws Exception {
                Object obj = null;
                List<DetailDataDto> retList = new ArrayList<DetailDataDto>();
                for (int i = start; i < end; i++) {
                    obj = list.get(i);
                    Thread myThread1 = new Thread(new HeadIn());
                    myThread1.start();
                    Thread myThread2 = new Thread(new AllIn());
                    myThread2.start();
                    Thread myThread3 = new Thread(new HeadNotIn());
                    myThread3.start();
                    latch.await();
// 我把三个多线程在这执行 
//这个可以填写自己的逻辑代码
                }
                //返回处理结果
                return retList;
            }
        }

        List<DetailDataDto> list = new ArrayList<DetailDataDto>(10000);
        int index = 0;
        ExecutorService ex = Executors.newFixedThreadPool(5);
        int dealSize = 2000;
        List<Future<List<DetailDataDto>>> futures = new ArrayList<>(5);
        //分配
        for (int i = 0; i <= 5; i++, index += dealSize) {
            int start = index;
            if (start >= list.size()) {
                break;
            }
            int end = start + dealSize;
            end = end > list.size() ? list.size() : end;
            futures.add(ex.submit(new Task(list, start, end)));
        }
        try {
            //处理
            List<Object> result = new ArrayList<>();
            for (Future<List<DetailDataDto>> future : futures) {
                //合并操作
                result.addAll(future.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

结果是很明显的 3秒  恩。。。这个还是可以接受,其他在硬件上优化  就是多线程分批跑数据 最后合并 在处理的过程。   记录的有些粗糙  不巧看到这篇贴子大神 勿喷。多谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 的多线程(multithreading)和多进程(multiprocessing)模块可以用于处理数据,提高程序效率。下面是一个简单的例子: 使用线处理数据 ``` import threading def process_data(data): # 处理数据的函数 pass def main(): data = get_data() # 获取数据 threads = [] for i in range(4): # 创建4个线程 t = threading.Thread(target=process_data, args=(data,)) threads.append(t) t.start() # 等待所有线程完成 for t in threads: t.join() if __name__ == '__main__': main() ``` 上面的代码中,我们首先定义了一个处理数据的函数 process_data(),然后使用线程模块创建了 4 个线程来处理数据。最后等待所有线程完成。 使用多进程处理数据 ``` import multiprocessing def process_data(data): # 处理数据的函数 pass def main(): data = get_data() # 获取数据 processes = [] for i in range(4): # 创建4个进程 p = multiprocessing.Process(target=process_data, args=(data,)) processes.append(p) p.start() # 等待所有进程完成 for p in processes: p.join() if __name__ == '__main__': main() ``` 上面的代码中,我们首先定义了一个处理数据的函数 process_data(),然后使用多进程模块创建了 4 个进程来处理数据。最后等待所有进程完成。 需要注意的是,多进程处理数据的开销比多线程大,因为每个进程都需要独立的内存空间和上下文。因此,如果处理数据较小,可以使用线程模块,而如果处理数据较大,可以考虑使用多进程模块。 ### 回答2: Python中的多线程是一种并发编程的方式,可以有效地处理数据。多线程可以同时执行多个任务,提高程序的运行效率和响应速度。 在Python中,可以使用内置的`threading`模块来实现多线程编程。通过创建多个线程对象,每个线程都可以独立执行不同的任务。这样可以在处理数据时同时执行多个任务,提高数据处理的速度。 多线处理数据时,需要考虑线程的同步和数据共享问题。由于多个线程会同时访问和修改共享的数据,可能会导致数据冲突和不一致。为了解决这个问题,可以使用锁(Lock)或其他同步机制来确保线程之间的数据同步和一致性。 在多线处理数据时,还需要注意线程的安全性。Python中的全局解释器锁(Global Interpreter Lock,GIL)限制了线程的并行执行,使得多线程不能真正实现并行处理。因此,对于某些密集计算型的任务,多线程可能并不能提升性能。 在结合Python的多线处理数据时,可以根据实际情况选择合适的线程数和线程策略,以达到最佳的数据处理效果。此外,还可以通过多进程、协程等方式来处理数据,根据具体需求选择合适的并发编程方式。 ### 回答3: Python是一种非常流行的编程语言,它有很多强大的库和工具,其中包括对多线处理数据的支持。多线程是一种并发编程的方式,它可以让程序同时执行多个任务,提高程序的效率。 在Python中,可以使用内置的`threading`模块来实现多线处理数据。这个模块提供了创建和管理线程的功能,可以让我们更方便地使用线程。 要使用线处理数据,首先我们需要定义一个线程函数,这个函数会被多个线程同时执行。在这个函数中,我们可以编写具体的数据处理逻辑。然后,我们可以使用`threading.Thread`类创建多个线程,并将线程函数作为参数传递给这些线程对象。最后,我们只需要调用这些线程对象的`start`方法,就可以启动这些线程并开始并行处理数据了。 多线处理数据的一个常见应用场景是并行计算。例如,我们可以将一个大型的计算任务分成多个子任务,然后分配给不同的线程同时进行计算。这样,整个计算过程可以在较短的时间内完成。 另一个常见的应用场景是并行IO操作,比如数据的读取和写入。通过将这些IO操作分配给不同的线程,可以提高数据处理速度。 需要注意的是,在多线处理数据时,我们需要注意处理线程之间的同步和互斥问题。多个线程同时访问共享的数据时,可能会引发竞争条件和数据不一致的问题。为了避免这些问题,我们可以使用锁或者其他同步机制来保证线程之间的正确和有序的执行。 总的来说,Python中的多线程可以帮助我们实现并发处理数据的需求,提高程序的效率。不过,要合理使用线程,并注意处理线程之间的同步和互斥问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值