首页 > 编程语言 >sb Python

sb Python

时间:2022-11-15 15:15:00浏览次数:34  
标签:deal Python self num input sb line fn

Linux

多进程tempfile读取异常,不知道原因是什么!!!!

Linux下运行一遍就知道了

from multiprocessing import Process, Pipe
from tempfile import TemporaryFile
import time


class MultiDeal:
    def deal(self):
        # input_fn, out_put_fn, pipe, line_range=None
        # 统计结果用管道输出
        # 行范围左闭右开
        pass

    def __init__(self, input_fn, output_fn, proc=4, deal_func=None, retain_merged_file=True):
        self.input_fn = input_fn  # 输入文件名
        self.output_fn = output_fn  # 输出文件名
        self.proc = proc or 2  # 进程数
        self.deal_func = deal_func or self.deal  # 处理多行数据
        self.retain_merged_file = retain_merged_file  # 保留合并的文件
        # 统计行数
        self.line_num = 0
        for i in open(input_fn): self.line_num += 1
        # 判断是否有必要采用多进程
        self.max_needed_line_num = 100

    def start(self):
        if self.line_num <= self.max_needed_line_num or self.proc == 1:
            # 启用单进程
            f = open(self.output_fn, mode='w+')
            p1, p2 = Pipe()
            self.deal_func(self.input_fn, f, p2)
            return p1.recv()
        else:
            # 分配多进程任务
            one_num = self.line_num // self.proc
            print(one_num, '行/进程')
            pipes = [Pipe() for i in range(self.proc)]  # 进程通信管道
            temp_fs = [TemporaryFile(mode='w+') for i in range(self.proc)]  # 临时文件,程序结束即自动删除
            for i in range(self.proc):
                Process(
                    target=self.deal_func,
                    args=(self.input_fn, temp_fs[i], pipes[i][1], (one_num*i, one_num*(i+1) if i != self.proc - 1 else self.line_num)),
                    daemon=True
                ).start()
            # 等待结果
            data = {}
            for p in pipes:
                recv = p[0].recv()
                for i in recv:
                    data[i] = data.get(i, 0) + recv[i]
            print('data:', data)
            # 合并临时文件
            print('开始合并文件')
            if self.retain_merged_file:
                f = open(self.output_fn, 'w')
                for tf in temp_fs:
                    tf.seek(0)
                    d = 0
                    for i in tf:
                        d += 1
                        f.write(i)
                    print('读了', d, '行')
                    tf.close()  # 删除临时文件
            return data


def generate_test_ww_txt():
    open('ww.txt', 'w').write('123\n'*int(10**7/2))


if __name__ == '__main__':
    fn = 'ww.txt'
    generate_test_ww_txt()

    def cal(input_fn, out_put_fn, pipe, line_range=None):
        print('范围:', line_range)
        f = open(input_fn) if type(input_fn) is str else input_fn
        fo = open(out_put_fn, 'w') if type(out_put_fn) is str else out_put_fn
        msg = {}
        c = 0
        for index, line in enumerate(f):
            if (line_range and line_range[0] <= index < line_range[1]) or line_range is None:
                c += 1
                if line != '123\n':
                    print('异常行:', line, index)
                fo.write(line.strip('\n')+'54\n')
        print('写了', c, '行')
        msg = {'ccc': 1}
        pipe.send(msg)

    t0 = time.time()
    # cal(fn, 'out1.txt', p2)
    MultiDeal(fn, 'out3.txt', deal_func=cal, proc=1).start()
    t1 = time.time()
    print('单线程用时:', t1 - t0)
    m = MultiDeal(fn, 'out2.txt', deal_func=cal)
    m.start()
    print('多进程用时:', time.time() - t1)

 

标签:deal,Python,self,num,input,sb,line,fn
From: https://www.cnblogs.com/roundfish/p/16892445.html

相关文章

  • python基础学习
     前言最近几年Python被吹的神乎其神,很多同学都不清楚Python到底能干什么?就盲目去学习Python,今天我就Python的应用领域来简单盘点一下,让想学习Python的同学找对方向不迷......
  • python三十四期--
    后续内容概要网络编程(2d)并发编程(3d)MySQL数据库(5d)仿优酷系统(3d~5d)前端基础(7d)django框架(12d)仿博客园系统(3d~5d)djangodrf商城项目期终架构部分常......
  • SB20100LCT-ASEMI低压降肖特基二极管SB20100LCT
    编辑:llSB20100LCT-ASEMI低压降肖特基二极管SB20100LCT型号:SB20100LCT品牌:ASEMI封装:TO-220AB正向电流:20A反向电压:100V引线数量:3芯片个数:2芯片尺寸:82MIL漏电流:10ua......
  • python, 解决:WARNING: Running pip as the 'root' user can result in broken permiss
    在使用pip过程中,如果出现如下提示:  则可以先CD进入Python安装目录,执行以下指令:假设Python3安装在/usr/local/python3cd/usr/local/python3python3-mvenvtut......
  • CSP 201312-2 ISBN号码 C++
     1#include<iostream>2#include<algorithm>4#include<array>56intmain(){7std::array<int,9>ISBN{};8charc{};9intlenth{......
  • python笔记74- yaml 使用特殊符号| 解决字符串带换行的问题
    前言在yaml文件中通过字符串写一行,如果字符串需要换行的,可以使用yaml中的特殊符号|和>。管道符||这个控制符的作用是保留文本每一行尾部的换行符"\n",等效于|+。|+......
  • python当中匿名函数lambda使用
    什么是匿名函数?匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。在python中,不通过def来声明函数名字,而是通......
  • python-元组、列表、字典
    python-元组、列表、字典一、元组"""python元组tuple不可变,不支持删除,添加,修改值:1、创建空元组,创建一个元素的元组(一个元素后加英文逗号)。2、通过索引获取使用......
  • Python取余/求余(%)问题,负数求余最简单的解释
      Python求余中会犯的错误思想如下:    一.忘记求商结果是负数时要向下取整,比如-2.25等于-3。    二.是把负数求余运算和正数求余运算混为一谈  ......
  • python django
    1、安装django2、查django版本python-mdjango--version3、创建django项目cdC:\Curtis\Python\Project4、django-adminstartprojectMySiteMySite是创建的djang......