Как получить возвращаемое значение из потока?

Пишу десктопное приложение и соединяю python и javascript при помощи библиотеки eel. JS функция проходит циклом и вызывает функцию ping при каждой итерации (Не знаю нужна ли в качестве примера функция JS). Главная проблема - как пробросить возвращаемое значение из work в ping?

Первый вариант без применения библиотеки queue, потоки отрабатывают быстро, но не знаю как пробросить значение.

import subprocess
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread

import eel as eel

eel.init("web")


def work(ip, port):
    if port:
        s = socket(AF_INET, SOCK_STREAM)
        try:
            timeout = 3
            s.settimeout(timeout)
            s.connect((ip, int(port)))
            s.settimeout(None)
        except:
            return False
        else:
            s.close()
            return True
    else:
        ret = subprocess.call(f"ping -c 1 -w 3 {ip}",
                              shell=True,
                              stdout=open('.logs.txt', 'w'),
                              stderr=subprocess.STDOUT)
        if ret == 0:
            return True
        else:
            return False


@eel.expose
def ping(ip, port):
    thread = Thread(target=work, name=ip, args=(ip, port))
    thread.start()


if __name__ == '__main__':
    eel.start('index.html', mode="chrome", size=(2560, 1600))

Второй вариант - с применением queue, проброс значения происходит, но потоки работают долго.

import subprocess
from queue import Queue
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread

import eel as eel

eel.init("web")

queue = Queue()


def work(queue):
    try:
        ip, port = queue.get()
    except:
        ip, port = queue.get(), None
    if port:
        s = socket(AF_INET, SOCK_STREAM)
        try:
            timeout = 3
            s.settimeout(timeout)
            s.connect((ip, int(port)))
            s.settimeout(None)
        except:
            queue.put(False)
        else:
            s.close()
            queue.put(True)
    else:
        ret = subprocess.call(f"ping -n 1 -w 3 {ip}",
                              shell=True,
                              stdout=open('.logs.txt', 'w'),
                              stderr=subprocess.STDOUT)
        if ret == 0:
            queue.put(True)
        else:
            queue.put(False)
    # queue.task_done()


@eel.expose
def ping(ip, port):

    thread = Thread(target=work, name=ip, args=(queue,))
    thread.start()
    queue.put((ip, port))
    thread.join()
    return queue.get()


if __name__ == '__main__':
    eel.start('index.html', mode="chrome", size=(2560, 1600))

В целом не исключаю, что проблема в скрипте. Но уже не знаю с какой стороны подступиться - или пробросить не получается, или потоки отрабатывают достаточно медленно. Хотелось бы добиться параллельной обработки потоков.

Можете подсказать решение проблемы или хотя бы объяснить в чем ошибка?


Ответы (0 шт):