我想實現的Python一個simpley端口掃描工具。它通過創建大量工作線程來工作,這些工作線程掃描隊列中提供的端口。他們將結果保存在另一個隊列中。當掃描所有端口時,線程和應用程序應該終止。這裏存在的問題是:對於少數端口一切正常,但如果我嘗試掃描200個或更多的端口,應用程序將陷入僵局。我不知道爲什麼。死鎖在Python線程
class ConnectScan(threading.Thread):
def __init__(self, to_scan, scanned):
threading.Thread.__init__(self)
self.to_scan = to_scan
self.scanned = scanned
def run(self):
while True:
try:
host, port = self.to_scan.get()
except Queue.Empty:
break
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, port))
s.close()
self.scanned.put((host, port, 'open'))
except socket.error:
self.scanned.put((host, port, 'closed'))
self.to_scan.task_done()
class ConnectScanner(object):
def scan(self, host, port_from, port_to):
to_scan = Queue.Queue()
scanned = Queue.Queue()
for port in range(port_from, port_to + 1):
to_scan.put((host, port))
for i in range(20):
ConnectScan(to_scan, scanned).start()
to_scan.join()
有沒有人看到什麼可能是錯的?另外,我會欣賞一些tipps如何在Python中調試這種線程問題。
你是對的,tast_done沒有被經常調用。原因是如果你嘗試連接到一個過濾的端口(即你不會得到任何響應),套接字不會拋出異常,而是永遠等待。那是我的僵局。 – j0ker