ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python多线程实现

2021-11-28 20:30:48  阅读:143  来源: 互联网

标签:__ python self 实现 线程 多线程 data cpu


python多线程实现

  有时候在进行数据处理时,处理的数据量非常庞大,在不使用并行化处理时可能需要若干小时。为了加快处理速度,使用多线程机制是非常常用的做法。本文简单实现了多线程的代码框架,可供数据处理使用。

  多线程主要包括三个部分:

  • 处理函数:主要负责对某一个线程拥有的数据进行处理,也即是单线程处理方法;
  • 线程分配:获取机器的CPU核数(线程数),并获得所有数据,按照一定规则进行数据分配;
  • 数据合并:每一个线程上会处理不同的数据,最后需要进行合并。
import multiprocessing
import numpy as np
from tqdm import tqdm
class MultiProcess:
    def __init__(self, dataset=None):
        self.dataset = [[1, 1, 1]] * 100
        
    def process(self, digits, fold="1by1"): # 处理函数:用于处理数据
        data, para_id = digits
        print(para_id)
        num = 0
        for i in tqdm(data):
            num += 1
#         np.save('para_{}.npy'.format(para_id), data) # 对每个线程处理好的数据进行保存

    def run(self): # 线程分配函数
        n_cpu = multiprocessing.cpu_count() # 获得CPU核数
        num = len(self.dataset) # 数据集样本数量
        self.n_cpu = n_cpu
        print('cpu num: {}'.format(n_cpu))
        chunk_size = int(num / n_cpu) # 分摊到每个CPU上的样本数量
        procs = []
        for i in range(0, n_cpu):
            min_i = chunk_size * i
            if i < n_cpu - 1:
                max_i = chunk_size * (i + 1)
            else:
                max_i = num
            digits = [self.dataset[min_i: max_i], i]
            # 每个线程唤醒并执行
            procs.append(multiprocessing.Process(target=self.process, args=(digits, "parallel")))
        for proc in procs:
            proc.start()
        for proc in procs:
            proc.join()
     
    def merge(self): # 数据合并函数:对每个线程上的处理好的数据进行合并
        all_data = []
        for i in range(self.n_cpu):
            data = np.load('para_{}.npy'.format(para_id), allow_pickle=True)
            all_data.append(data)
        return all_data

if __name__ == '__main__':   
    m = MultiProcess()
    m.run() # 多线程
    # m.merge() # 对每个线程数据进行合并

  测试机器为8核,测试效果如下:
在这里插入图片描述
  读者可自行修改类中函数,实现更为复杂的功能。

标签:__,python,self,实现,线程,多线程,data,cpu
来源: https://blog.csdn.net/qq_36426650/article/details/121596623

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有