[英]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.