猿问

ThreadPoolExeturor 的未来永远不会结束

我正在为一个程序编写一个后端,该程序需要能够 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)



我正在寻找任何关于为什么未来无法解决的想法。


哈士奇WWW
浏览 107回答 1
1回答

森林海

因此,在深入研究flask-socketIO的源代码后,我发现socketIO喜欢占用线程。这意味着您必须自己使用 gevent 或 eventlet 自行修补它以使用另一个。
随时随地看视频慕课网APP

相关分类

Python
我要回答