繁体   English   中英

在无限循环中使用线程和队列不会关闭线程

[英]Using Threading and Queue in infinite loop does not close threads

我正在努力让python定期运行一些线程化函数并关闭线程(或重用相同的线程而不会产生新的线程)。 当运行下面的代码时,每次运行该函数都会产生新的线程,最终程序一起崩溃/停止。

完成任务后是否可以关闭线程?

import threading
from Queue import Queue
import time
import socket

number_of_threads = 10

def check_server(address):
    s = socket.socket()
    s.settimeout(1)
    try:
        s.connect((address, 443))
        return True
    except:
        return False

def get_online_servers(subnet):
    def threader():
        while True:
            global online_servers
            ip = q.get()
            a = check_server(ip)
            if a:
                online_servers.append(ip)
            q.task_done()

    q = Queue()

    for x in range(number_of_threads):
        t = threading.Thread(target=threader)
        t.daemon = False
        t.start()

    for i in range(1, 20):
        ip = "{}.{}".format(subnet, i)
        q.put(ip)

    q.join()

    return online_servers

if __name__ == '__main__':
    while True:
        online_servers = []
        result = get_online_servers("10.0.0")
        print result
        time.sleep(5)

线程在完成其功能时自动完成。 (您通常确实希望保留线程对象并将它们join到某个位置,但这与您的问题无关。)

因此,如果希望它们在完成每个任务后完成,为什么还要在函数内部放置while True:循环呢? 只需取出即可,一切都会按照您的要求进行。

使线程运行无限循环直到队列完成(然后break / return )可能会很有用,但这是另一种设计。 对于该设计,您只想在启动时启动10个线程,而不是为每个请求启动新一批线程。 (虽然在这种情况下,你只是建立一个沼泽标准的线程池,所以它可能是更容易使用的STDLIB-或稍高级别的已经存在的一个concurrent.futures.ThreadPoolExecutor 。)

最后,如果您真正想要的是每批请求一个10个线程的新池,则可以这样做。 基本上,这是两种选择的全部复杂性,没有任何优势,但这是可行的。 就像在持久性线程池中一样,您需要将线程功能更改为在队列完成后退出。 您可能需要将所有10个线程保留在一个列表中,并在加入队列后将它们全部加入。 但这应该可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM