如何在继续之前等待线程完成

时间:2016-06-30 19:23:22

标签: python multithreading pyqt4 multiprocess

我需要在另一个线程中运行一个函数,并获取该函数的返回值以将其保存到主线程中的变量。基本上,我的代码调用函数,该函数通过串口与天平通信,等待并获取响应,解析响应,并以float形式返回响应。我需要捕获这个浮点数,以便我可以保存它。这是我的代码:

from multiprocessing.pool import ThreadPool

pool = ThreadPool(processes=2)
result = pool.apply_async(manual_short_command, (self.status_signal2, self.conn, command, status_string, 2))
self.readout = result.get()

def manual_short_command(signal, conn, command, status_string, string_arg='', timeout=60):
""" Send specified command (expects a balance response)to balance through "conn" and emit status signal """
print "Command: " + command.strip('\r\n')
emit_status(signal, status_string[0], string_arg)
if not conn.isOpen():
    conn.open()
# Wait until nothing can be read at the balance port
while not timeout and conn.readlines():
    time.sleep(1)
    timeout -= 1
# Write the command to the balance port and wait for response
while timeout:
    time.sleep(1)
    conn.write(command)
    resp = conn.readlines()

    try:
        resp = float(resp[0])
    except ValueError:
        pattern = r'(.?\d+\.\d+)'
        match = re.findall(pattern, resp[0])
        resp = float(match[0])
    except IndexError:
        continue

    print resp
    print 'timeout: %s' % timeout
    if resp:
        emit_status(signal, status_string[1], str(resp))
        print resp, 'here'
        return resp

    timeout -= 1
conn.close()
print resp
return resp

我在另一个线程中启动函数manual_short_command,此函数通过串口发送命令并等待响应。然后它返回此响应并将其写入状态浏览器(我使用PyQt4作为GUI,但我认为这是无关紧要的)。

我在尝试分配self.readout = result.get()时遇到错误,说IndexError: list index out of range,这意味着该函数尚未在另一个线程中完成。在分配结果之前,如何等待线程完成?否则我的程序会挂起。我查看Threading pool similar to the multiprocessing Pool?获得了一些指导,但我无法找到如何同步两个线程。有什么建议?对不起,有大量的代码。

1 个答案:

答案 0 :(得分:2)

您可以使用join()。 这将使程序等到线程完成,然后将移动到显示结果。