数据文件很多,可以通过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()