Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中终止已完成的线程_Python_Multithreading - Fatal编程技术网

如何在python中终止已完成的线程

如何在python中终止已完成的线程,python,multithreading,Python,Multithreading,我的多线程脚本引发此错误: thread.error : can't start new thread 当达到460个线程时: threading.active_count() = 460 我假设旧线程一直堆积在一起,因为脚本没有杀死它们。这是我的代码: import threading import Queue import time import os import csv def main(worker): #Do Work print worker ret

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

thread.error : can't start new thread
当达到460个线程时:

threading.active_count() = 460
我假设旧线程一直堆积在一起,因为脚本没有杀死它们。这是我的代码:

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()

当旧线程的任务完成时,我如何杀死它们?(返回值不够吗?

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

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

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
传递给线程函数。您不希望以前调用创建的线程最终与新线程共享
q
(尽管编辑
q.join()
可以防止这种情况,但最好避免全局线程)。

您的
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
传递给线程函数。您不希望由上一次调用创建的线程最终与新线程共享
q
(尽管
q.join()
可以防止这种情况,但最好避免全局循环)。

threader
是一个无限循环。。但我看不出你是如何在这里创建超过20个线程的。这段代码真的会引发错误吗?我从另一个脚本调用main_threader(workers),通常没有线程。所以,您重复调用它?好的,那么,
线程器
功能从哪里退出呢
main
调用
return
,但这只是返回到
threader
,它继续执行
而True
循环。主要功能是执行刮片工作,worker参数是刮片的链接。有没有办法杀死所有完成工作的线程?
threader
是一个无限循环。。但我看不出你是如何在这里创建超过20个线程的。这段代码真的会引发错误吗?我从另一个脚本调用main_threader(workers),通常没有线程。所以,您重复调用它?好的,那么,
线程器
功能从哪里退出呢
main
调用
return
,但这只是回到
threader
,它继续执行
while True
循环。主要功能是执行刮片工作,worker参数是刮片的链接。有没有办法杀死所有完成工作的线程?很好,现在线程没有堆叠,但是我现在只使用了两个线程?我怀疑你的工作进行得太快了,以至于不止一个线程在同一时间处于活动状态。既然队列在创建线程之前就被填满了,那么前两个线程可能会在创建完其余线程之前完成整个队列。您可以尝试将
time.sleep(1)
添加到
main
函数中,查看是否会看到更多同时执行的线程。主函数占用的时间超过1秒,线程。active\u count()是否也会返回已完成的线程?因为每个新线程的线程数都在增加。如果它一直在增加,你怎么会认为你只处理了2个线程?对不起,我刚才说的是上次修改前的结果,修改后的线程数只有2个。active_count()和终端(“ps-o nlwp”)很好,现在线程没有堆叠,但是我现在只使用了两个线程?我怀疑你的工作进行得太快了,以至于不止一个线程在同一时间处于活动状态。既然队列在创建线程之前就被填满了,那么前两个线程可能会在创建完其余线程之前完成整个队列。您可以尝试将
time.sleep(1)
添加到
main
函数中,查看是否会看到更多同时执行的线程。主函数占用的时间超过1秒,线程。active\u count()是否也会返回已完成的线程?因为每个新线程的线程数都在增加。如果它一直在增加,你怎么会认为你只处理了2个线程?对不起,我刚才说的是上次修改前的结果,修改后的线程数只有2个。active_count()和终端(“ps-o nlwp”)