Проверить состояние потока и вернуть из него результат?
Нужно в в одной функции запустить другую, в которой происходит подключение с помощью zmq к другому компьютеру. Необходимо вызвать функцию подключения, подождать секунд 10 и, если успешно подключилось, взять результат из функции подключения, если она не подключилась, то выкинуть ошибку. Кусок функции, в которой вызываю функцию подключения:
result =["fail"]
t = Thread(target= ping_function, args=(conn_str, task.task_json))
t.start()
time.sleep(10)
if t.is_alive() == True:
ret = "is alive"
t.join()
Функция подключения:
def ping_function(conn_str, json):
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect(conn_str)
socket.send_json(json)
socket.recv_json()
result[0] = "good"
return("good")
Не совсем понимаю, как надо делать, нигде не смогла найти объяснение по моей ситуации, не судите строго)
Ответы (1 шт):
Автор решения: alex
→ Ссылка
return = 1
это синтаксическая ошибка.
из потока можно вернуть результат используя список.
result = ["fail"]
def ping_function(conn_str, json):
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect(conn_str)
socket.send_json(json)
socket.recv_json()
result[0] = "good"
return
t = Thread(target= ping_function, args=(conn_str, task.task_json))
t.start()
time.sleep(10)
if t.is_alive() == True:
ret = "is alive"
t.join()
print(result[0])
а еще можно воспользоваться ThreadPoolExecutor из concurrent.futures
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor()
def ping_function(conn_str, json):
try:
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect(conn_str)
socket.send_json(json)
socket.recv_json()
except Exception:
state = "error"
else:
state = "good"
return state
feature = pool.submit(ping_function, conn_str, task.task_json)
result = feature.result(10)
print(result)