Как получить возвращаемое значение из потока?
Пишу десктопное приложение и соединяю 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))
В целом не исключаю, что проблема в скрипте. Но уже не знаю с какой стороны подступиться - или пробросить не получается, или потоки отрабатывают достаточно медленно. Хотелось бы добиться параллельной обработки потоков.
Можете подсказать решение проблемы или хотя бы объяснить в чем ошибка?