python - 在无限循环中使用Threading和Queue不会关闭线程

标签 python multithreading python-2.7 python-multithreading

我正在努力让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 个线程保留在一个列表中,并在加入队列后将它们全部加入。但这应该可行。

关于python - 在无限循环中使用Threading和Queue不会关闭线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49148997/

相关文章:

python - 如何找到两个数据框的补充

python - 使用inspect模块获取继承对象的名称

java - 如何将我的主线程与创建的工作线程连接?

java - 为什么线程无法更新ArrayList字段?

python - 当网站也发出 HTTP 错误代码时如何访问 xml 响应

c++ - NumPy 的 C++ : How to iterate over PyArrayObject without a segfault

mysql - Hibernate/MySQL 并发问题

python - 如何通过python打开文件夹名称为正则表达式的文件?

python - 安装适用于 Python 的 MATLAB 引擎

image - 在按钮上调整图像