簡體   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