Crossin的编程教室

标题: 跪求crossin老师指点,感谢 [打印本页]

作者: mfx    时间: 2021-11-4 16:46
标题: 跪求crossin老师指点,感谢
求大神指点,我的目的是读取一个文本,然后将文本每行中如果包含‘!'或者“#‘的行删掉,然后取剩下的行生成一个文本。
因为有的文本比较大,便历起来比较慢,我试着用多线程来操作,但是每次都会报如图片的错误,请大神指点,谢谢
代码如下:
import time
import requests,threading
starttime = time.time()
print ('start:%f' % starttime)
#读取S参数,生成新的文本
file='DM1_PKG_XGMI_TX.s12p'
data=open(file)
##n=8   #以s12p文件为例,后续需要改成输入条件
f=data.readlines()
data.close()
#如果行第一个字符是!或#则变空,把所有数据行和成一个字符串
result=[]

def shaixuan(i):
    lock.acquire()
    if '!' in f[i]:
        f[i]=''
    elif '#' in f[i]:
        f[i]=''
    else:
        pass
    result+=f[i]
    lock.release()
if __name__ == '__main__':
    # 定义一个线程锁
    # 注意修改同一个变量的线程要使用同一个锁
    lock = threading.Lock()
    # 开启多个线程
    t_list = []
    for i in range(len(f)):
        t = threading.Thread(target=shaixuan, args=(i,))
        lock = threading.Lock()
        t_list.append(t)
        t.start()
    for t in t_list:
        t.join()
with open('data11.txt','w') as t:
    t.write(result)
    t.close
endtime = time.time()
print ('start:%f' % endime-starttime)

报错截图附件


捕获.GIF (22.22 KB, 下载次数: 946)

捕获.GIF


作者: crossin先生    时间: 2021-11-4 21:48
代码里小错误很多,建议:
1. 先把非多线程的功能写出来,再考虑多线程
2. 换个高级一点的IDE。pycharm或者vscode都可以,至少把报错信息能显示清楚

bug1
shaixuan函数里用了全局变量result,但没有声明 global result

bug2
t.write(result) 改成 t.writelines(result)

bug3
t.close() 少括号

bug4
最后一行少括号且拼错变量名,改成 print ('start:%f' % (endtime-starttime))

最后我还要说下,你这个需求,要保证每一行的顺序,所以你函数都是加锁来实现,那这个完全没有任何并行的操作,还是排着队一个个等,反倒多了开线程的消耗
你可以拿你的大文件测一下,可能时间比你写一个非多线程的代码更长
作者: mfx    时间: 2021-11-5 11:25
crossin先生 发表于 2021-11-4 21:48
代码里小错误很多,建议:
1. 先把非多线程的功能写出来,再考虑多线程
2. 换个高级一点的IDE。pycharm或者 ...

多谢老师指点,单线程的程序我已经写完了,这个只是局部的代码。
但是在大文件的时候需要执行的时间很长,可能三四个小时,所以才想着用多线程看能否提升下效率。

初学者,有不少毛病,多谢老师





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5