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

How to delete thread object from device after finishing the task?

如何在完成作业后删除线程对象? 下面是创建线程的代码,也看到创建的线程数达到了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())

你担心的不是问题。文字"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 变量被 deled 之后它仍然存在。这些循环引用不是问题,因为它们会在 Python 垃圾收集器为 运行 时被捕获(但具体发生时间是任意的)。

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


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