我正在为一个程序编写一个后端,该程序需要能够 ping 网络上的所有设备以查看它们是否存在。该后端在 Flask 套接字上运行。我编写了一个简单的测试脚本,它使用 threadExecutor 和 futures 来加速该过程。
import platform
import subprocess
import netifaces as ni
import concurrent.futures
import socket
baseIP = 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)
我正在寻找任何关于为什么未来无法解决的想法。
森林海
相关分类