终止剩余的线程

Posted

技术标签:

【中文标题】终止剩余的线程【英文标题】:Terminate remained Threads 【发布时间】:2015-10-01 05:39:59 【问题描述】:

如何在 python 的 工作中间 中杀死 remained threads ? 示例代码:

q = Queue.Queue(maxsize=0)
threads = []
max_thread = 10
locker = threading.Semaphore(value=max_thread)
try :
    for user in users_list:
    t = threading.Thread(target=my_function, args=(user,))
    t.setDaemon(True)
    threads.append(t)
    t.start()
    for thread in threads:
        q.put(thread)
    q.join()
except Exception as errtxt:
    print errtxt

这个函数例如用在线程池中,在这个函数中我想收集只有30个用户支付超过5000

def my_function(user):
    locker.acquire()
    if (user.payment > 5000 ):
       collected_users.append(user.id)
       if(len(collected_users) >= 30 :
           return # <- here i wanna kill other remained threads 

    q.task_done()
    locker.release()

我想我应该在队列中设置一个控制器/

【问题讨论】:

您之前问过类似的问题,并已接受答案:***.com/questions/26068819/…。发生了什么变化? @Tsyvarev,python中的多处理模块和线程模块有很多不同。 哦,是的,我没有注意那个关于流程的老问题。至于线程,你不能直接杀死其他线程,你应该配合它。见,例如那个问题:***.com/questions/323972/…. 【参考方案1】:

我试图为我的问题找到解决方案,这是我的代码: 希望有人能做得更好

import Queue , threading 

q = Queue.Queue(maxsize=0)
threads = []
max_thread = 10
exitFlag = False
users_id = []
collected_users = []

queueLock = threading.Lock()

for x in range(1,50):
    users_id.append(x)

def my_function():
    if not q.empty():
       ids = q.get()
       print (ids)
       if (ids < 5000 ):
            collected_users.append(ids)
       if(len(collected_users) >= 10) :
            print ("collected")
            exitFlag = True
            q.queue.clear()
            q.task_done()
       else:
            q.task_done()
            return
try :
    for ids in users_id:
        q.put(ids)
    while not q.empty():
        queueLock.acquire()
        for workers in range(max_thread):
            t = threading.Thread(target=my_function)
            t.setDaemon(True)
            t.start()
            threads.append(t)
        for t in threads:
            t.join()
        queueLock.release()
        if (exitFlag == True):
            break

   print ("All jobs finished")
except Exception as errtxt:
   print errtxt

【讨论】:

以上是关于终止剩余的线程的主要内容,如果未能解决你的问题,请参考以下文章

Python 并发编程之线程

c++11的线程,怎么终止

C语言如何终止线程

线程操作之终止线程

JVM 如何终止守护线程?或如何编写优雅终止的守护线程

java 线程的终止与线程中断