我正在為一個程序編寫一個后端,該程序需要能夠 ping 網(wǎng)絡上的所有設備以查看它們是否存在。該后端在 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 運行得很好,并為我提供了網(wǎng)絡上的設備列表。但是當我在我的 Flask 應用程序中實現(xiàn)這段代碼時,future 永遠不會結(jié)束,導致它掛在它嘗試掃描的第一個 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)我正在尋找任何關(guān)于為什么未來無法解決的想法。
1 回答

森林海
TA貢獻2011條經(jīng)驗 獲得超2個贊
因此,在深入研究flask-socketIO的源代碼后,我發(fā)現(xiàn)socketIO喜歡占用線程。這意味著您必須自己使用 gevent 或 eventlet 自行修補它以使用另一個。
添加回答
舉報
0/150
提交
取消