我正在为一个程序编写一个后端,该程序需要能够 ping 网络上的所有设备以查看它们是否存在。该后端在 Flask 套接字上运行。我编写了一个简单的测试脚本,它使用 threadExecutor 和 futures 来加速该过程。import platformimport subprocessimport netifaces as niimport concurrent.futuresimport socketbaseIP = ni.ifaddresses('enp4s0')[ni.AF_INET][0]['addr']prefix = '.'.join(baseIP.split('.')[0:3])aliveIPs = []def ping(ip): command = ['ping', '-c 1', '-w 5', ip] print(ip) if(subprocess.call(command) == 0): return socket.gethostbyaddr(ip) else: return ''ips = [prefix + '.' +str(i) for i in range(0,255)]with concurrent.futures.ThreadPoolExecutor() as executor: futures = [] for ip in ips: futures.append(executor.submit(ping, ip=ip)) for future in concurrent.futures.as_completed(futures): res = future.result() if(res != ''): aliveIPs.append(res)print(aliveIPs)这段代码在我的电脑上使用 python3 运行得很好,并为我提供了网络上的设备列表。但是当我在我的 Flask 应用程序中实现这段代码时,future 永远不会结束,导致它挂在它尝试扫描的第一个 ip 上。以下代码来自我的烧瓶应用程序。def ping(ip): print(ip) proc = subprocess.run(['ping', '-c 1', '-w 5', ip]) if(proc == 0): print("alive") return socket.gethostbyaddr(ip) else: print("none") return ''"""gets a list of available hosts in the network for a connection"""def update_worker_list(executor): print("updating") network_device = get_network_info()['net_name'] ip = ni.ifaddresses(network_device)[ni.AF_INET][0]['addr'] ipPrefix = '.'.join(ip.split('.')[0:3]) alive_ips = [] ips = [ipPrefix + '.' + str(i) for i in range(0, 255)] futures = [] for ip in ips: futures.append(executor.submit(ping, ip=ip)) for future in concurrent.futures.as_completed(futures): res = future.result() if(res != ''): alive_ips.append(res) print(alive_ips)我正在寻找任何关于为什么未来无法解决的想法。
1 回答
![?](http://img1.sycdn.imooc.com/545868b60001587202200220-100-100.jpg)
森林海
TA贡献2011条经验 获得超2个赞
因此,在深入研究flask-socketIO的源代码后,我发现socketIO喜欢占用线程。这意味着您必须自己使用 gevent 或 eventlet 自行修补它以使用另一个。
添加回答
举报
0/150
提交
取消