带线程的Python重复IPScan

2024-09-28 21:54:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在重复ip扫描后,程序崩溃。线程没有被杀死,我不知道如何处理这个。你知道吗

import time
import datetime
import subprocess,os,threading
from queue import Queue

ipbase = "192.168.101.{0}"
startadd = 20
stoppadd = 100

def ipscan(): #looking for available IP adresses
    lock=threading.Lock()
    _start=time.time()

    def check(n):
        with open(os.devnull, "wb") as limbo:
            ip=ipbase.format(n)
            result=subprocess.Popen(["ping", "-n", "2", "-w", "300", ip],stdout=limbo, stderr=limbo).wait(timeout=10)
            with lock:                    
                if not result:
                    print (ip, "active")
                else:
                    pass 

    def threader():
        while True:
            worker=q.get()
            check(worker)
            q.task_done()
    print("Scan IP...")        
    print("Address scan from " + ipbase + str(startadd) + " until " + ipbase    + str(stoppadd))
    q=Queue()
    for _ in range(startadd,stoppadd):
        t=threading.Thread(target=threader)
        t.daemon=True
        t.start()

    for worker in range(startadd,stoppadd):
        q.put(worker)
    q.join()

if __name__ == "__main__":
    starttime = datetime.datetime.now()
    print (starttime)
    print("first check of available ip adresses..")
    ipscan() #looking for available IP adresses

    cyclebegin = datetime.datetime.now()
    acttime = datetime.datetime.now()
    sampletime = 3
    while (1):
        if ((acttime - cyclebegin) > datetime.timedelta(seconds=sampletime)):
            dtime = acttime - cyclebegin
            print ("delta-seconds: ",dtime.seconds)
            cyclebegin = datetime.datetime.now()

            ipscan()

        acttime = datetime.datetime.now()

在ipscan使用q.join()完成之后,任务应该完成,但不是终止,正如我所理解的那样。通过反复调用ipscan,线程的限制被超越。我要修改什么来防止这种情况


Tags: importipfordatetimetimenowworkerprint