如何在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”)