Проверить состояние потока и вернуть из него результат?

Нужно в в одной функции запустить другую, в которой происходит подключение с помощью 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)
→ Ссылка