同时对N个文件进行操作--多进程

数据文件很多,可以通过DIE分成多组,其中每组数据文件可以独立完成操作,提效方法:N个进程同时运行
界面:qt designer编写
主程序中设置多进程,其中multiprocessing.freeze_support()可以实现:在程序打包后,运行时只出现一个界面,否则设置几个进程会增加出现几个窗口


import multiprocessing
import test_main

class mywindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self):
        super(mywindow, self).__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.mains)

    def mains(self):
    	LotID =test_mian.tomain(filepath, 8) #8为进程个数

if __name__=="__main__":

    app=QtWidgets.QApplication(sys.argv)
    myshow=mywindow()
    multiprocessing.freeze_support()  
    myshow.show()
    sys.exit(app.exec_())

下面是文件test_main.py。中间增加一个转换的函数,因为最终的实现函数有参数>1,搞不懂怎么实现更好,网上搜了一些方法,感觉增加一个函数更方便。。。。(新手勿喷)

from multiprocessing import Pool as ProcessPool

def to_main(filepath):
    #省略获取参数DieID的部分
    BIN_exchange(filepath, DieID)
    
def tomain(filepath, num):
    #省略获得filepath中的需要处理的文件地址,DB_path_list
    with ProcessPool(processes= num) as pool:
        pool.map(to_main, DB_path_list)#这里才真正实现多进程操作,参数1为要实现多进程的函数A,参数2为函数A的形参集
    return WaferID

with ProcessPool(processes= num) as pool: pool.map(to_main, DB_path_list)
pool.map()官方解释:
def map(self, func, iterable, chunksize=None):

  Apply `func` to each element in `iterable`, collecting the results in a list that is returned.

return self._map_async(func, iterable, mapstar, chunksize).get()

操作的文件为csv,需要修改里面部分内容,代码如下:

            fp = open(filepath_DB, 'w', newline='', encoding='utf-8')
            csv_write = csv.writer(fp)
            print(DB_data)
            for j in range(0, len(DB_data)):
                print(DB_data[j])
                csv_write.writerow(DB_data[j])

这样用的一直都没有问题,但是今天运行程序发现8个进程时,第一次的8个文件有一些会被清空,直到将进程数量减少为2才避免了清空。最后检查代码,缺少文件关闭,添加上后,果然该问题没有了,我理解的是,那几个文件不是被清空了,而是仍然在后台未关闭,所以看起来是0kb。修改如下:

            fp = open(filepath_DB, 'w', newline='', encoding='utf-8')
            csv_write = csv.writer(fp)
            print(DB_data)
            for j in range(0, len(DB_data)):
                print(DB_data[j])
                csv_write.writerow(DB_data[j])
            fp.close()
本资源含所有三个任务的源代码,采用Visual Studio.NET 2003的C++与MFC编写(前端有图形化界面),供各位参考。 课程设计目的 本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。 课程设计要求 (1)对进行认真分析,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据。 (2)以完整的作业包的形式提交原始代码、设计文档和可运行程序。提交的光盘应当包括:设计题目,程序清单,运行结果分析,所选取的算法及其优缺点,以及通过上机取得了哪些经验。程序清单要求格式规范,注意加注释(包含关键字、方法、变量等),在每个模块前加注释,注释不得少于20%。课程设计要求同时上交打印文档,设计报告包括设计题目,算法分析,关键代码及其数据结构说明,运行结果分析以及上机实践的经验总结。 设计一: 设计任务:模拟Linux文件系统 在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。 在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。 编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: 盘块大小1k 空闲盘块的管理:Linux位图法 结构:超级块, i结点区, 根目录区 该simdisk管理程序的功能要求如下: info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。 dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 newfile …: 建立文件。 cat …: 打开文件。 copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令: simdisk copy D:\data\sample\test.txt /test/data 或者:simdisk copy D:sample\test.txt /test/data del …: 删除文件:删除指定文件,不存在时给出出错信息。 check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。 程序的总体流程为: 初始化文件目录; 输出提示符,等待接受命令,分析键入的命令; 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。 设计二: 设计任务:模拟文件系统的前端操作shell 实现一个简单的shell(命令行解释器)。 将设计一的管理程序simdisk作为后台进程运行,利用本设计任务的shell操作simdisk。 本设计任务在于学会如何实现在前端的shell进程和后端的simdisk进程之间利用共享内存进行进程间通信(IPC)。 设计三: 设计任务:模拟文件系统的操作管理 实现多个进程同时对模拟文件系统进行操作。设计管理程序simdisk的用户访问权限管理。访问模拟文件系统的每个进程都属于某个用户,管理程序simdisk根据其访问权限决定其对模拟文件系统的操作。 对模拟文件系统的操作要求做到:共享读,互斥写。 本设计任务在于学会如何实现信息的安全管理和进程同步。 注:要求从课程设计的整体来考虑设计任务一、二、三,并分阶段实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值