如何在完成任务后从设备中删除线程对象?

2022-09-28 21:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

作业完成后如何删除线程对象? 下面是创建线程的代码,还可以看到创建的线程数达到100线程查看图片,如何删除它们?你知道吗

if __name__ == "__main__":
    segmentationProcess = SegmentationProcess()
    data = segmentationProcess.readDoc("./IT resumes as text/ktalzoubi.txt")
    data = segmentationProcess.preProcess(data)
    lock = multiprocessing.Lock()
    thread1 = ThreadWithLogAndControls(target=segmentationProcess.searchWorkExperience, args=(data, "W", lock))
    thread2 = ThreadWithLogAndControls(target=segmentationProcess.searchEducation, args=(data, "E", lock))
    thread3 = ThreadWithLogAndControls(target=segmentationProcess.serchSkills, args=(data, "S", lock))
    thread4 = ThreadWithLogAndControls(target=segmentationProcess.searchOthers, args=(data, "O", lock))
    wr1 = weakref.ref(thread1)
    wr2 = weakref.ref(thread2)
    wr3 = weakref.ref(thread3)
    wr4 = weakref.ref(thread4)
    thread1.start()
    thread2.start()
    thread3.start()
    thread4.start()
    print(wr1())
    thread1.join()
    thread2.join()
    thread3.join()
    thread4.join()
    del thread1, thread2, thread3, thread4
    print(wr1())

enter image description here


Tags: reflocktargetdataargs线程startjoinweakrefthread1thread2thread3thread4threadwithlogandcontrolssegmentationprocess
1条回答
网友
1楼 ·

你担心的不是问题。文本“thread-103”并不意味着当前有103个线程。相反,它表明已经创建了>;=103个线程。它来自the Python threading module:如果没有为新线程提供名称,则默认为Thread-<number><number>只会上升,即使线程被销毁也不会下降(如果线程是用名称创建的,它也不会上升,因此显示的数字只是一个下限)。这只是为了给每个线程一个可识别的名称,而不是其他任何东西。你知道吗

这些线程可能是在以下行中创建的:

data = segmentationProcess.readDoc("./IT resumes as text/ktalzoubi.txt")
data = segmentationProcess.preProcess(data)

我们显然不知道这些函数中有什么。线程可能正在被正确地清理,但是由于您没有提供mininal reproducible example,因此无法提供任何进一步的细节。你知道吗


还有第二点:调用Python对象的时间点非常不可靠。del不会这样做-它只会中断对对象的单个引用。很可能存在对存储在thread1中的对象的一些循环引用,因此即使在thread1变量被del编辑之后它仍然存在。这些循环引用不是问题,因为它们将在运行Python垃圾收集器时被捕获(但发生这种情况的确切时间是任意的)。你知道吗

因此,资源(除了内存)不应该依赖对象销毁来释放它们。标准的Python习惯用法是使用with块或try: ...; finally:。但是,在多线程的情况下,您应该关心的资源是在线程完成时释放的,所以(同样)不是问题。(或者至少是你无法控制的问题)。你知道吗


最后,您看起来将multiprocessing.Lockthreading混合。这是两种不同的并行Python代码的方法,我不认为混合它们是有效的(可能是,可能不是,但它给人的印象是你还没有真正理解你在做什么)。你知道吗

热门问题