如何在python中杀死已完成的线程

2024-06-25 05:29:57 发布

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

引发此错误的多线程脚本:

thread.error : can't start new thread

当达到460个螺纹时:

^{pr2}$

我想旧线程会一直堆积起来,因为脚本没有杀死它们。这是我的代码:

import threading
import Queue
import time
import os
import csv


def main(worker):
    #Do Work
    print worker
    return

def threader():
    while True:
        worker = q.get()
        main(worker)
        q.task_done()        

def main_threader(workers):
    global q
    global city
    q = Queue.Queue()
    for x in range(20):
        t = threading.Thread(target=threader)
        t.daemon = True
        print "\n\nthreading.active_count() = "  + str(threading.active_count()) + "\n\n"
        t.start()
    for worker in workers:
        q.put(worker)   
    q.join()

当旧线程的工作完成后,我如何杀死它们?(回报不够吗?)在


Tags: import脚本truequeuemaindef线程global
1条回答
网友
1楼 · 发布于 2024-06-25 05:29:57

你的threader函数永远不会退出,所以你的线程永远不会死。由于您只处理一组固定的工作,并且在开始工作后从不添加项目,所以可以将线程设置为在队列为空时退出。在

请参阅以下更改后的代码版本和我添加的注释:

def threader(q):
    # let the thread die when all work is done
    while not q.empty():
        worker = q.get()
        main(worker)
        q.task_done()        

def main_threader(workers):
    # you don't want global variables
    #global q
    #global city
    q = Queue.Queue()
    # make sure you fill the queue *before* starting the worker threads
    for worker in workers:
        q.put(worker)  
    for x in range(20):
        t = threading.Thread(target=threader, args=[q])
        t.daemon = True
        print "\n\nthreading.active_count() = "  + str(threading.active_count()) + "\n\n"
        t.start() 
    q.join()

请注意,我删除了global q,而是将q传递给线程函数。您不希望由前一次调用创建的线程最终与新线程共享qedit,尽管q.join()阻止了这一点,但最好还是避免使用全局变量)。在

相关问题 更多 >