如何在python中同步线程?

时间:2011-11-14 20:29:45

标签: python multithreading synchronization locking

我在python(2.7)中有两个线程。 我在程序开始时启动它们。当它们执行时,我的程序到达终点并退出,在等待解决之前杀死我的两个线程。

我正在试图弄清楚如何在退出之前等待两个线程完成。

def connect_cam(ip, execute_lock):
    try:
        conn = TelnetConnection.TelnetClient(ip)
        execute_lock.acquire()
        ExecuteUpdate(conn, ip)
        execute_lock.release()
    except ValueError:
        pass


execute_lock = thread.allocate_lock()
thread.start_new_thread(connect_cam, ( headset_ip, execute_lock ) )
thread.start_new_thread(connect_cam, ( handcam_ip, execute_lock ) )

在.NET中,我会使用像WaitAll()这样的东西,但是我没有在python中找到它。在我的场景中,TelnetClient是一个很长的操作,可能会在超时后导致失败。

3 个答案:

答案 0 :(得分:4)

Thread是Python的线程机制的低级原始接口 - 改为使用threading。然后,您可以使用threading.join()来同步线程。

  

其他线程可以调用线程的join()方法。这阻止了   调用线程直到调用join()方法的线程为止   终止。

答案 1 :(得分:3)

Yoo可以做类似的事情:

import threading

class connect_cam(threading.Thread):

    def __init__(self, ip, execute_lock):
        threading.Thread.__init__(self)
        self.ip = ip
        self.execute_lock = execute_lock

    def run(self):
        try:
            conn = TelnetConnection.TelnetClient(self.ip)
            self.execute_lock.acquire()
            ExecuteUpdate(conn, self.ip)
            self.execute_lock.release()
        except ValueError:
            pass


execute_lock = thread.allocate_lock()
tr1 = connect_cam(headset_ip, execute_lock)
tr2 = connect_cam(handcam_ip, execute_lock)
tr1.start()
tr2.start()
tr1.join()
tr2.join()

使用方法.join(),两个线程(tr1和tr2)将相互等待。

答案 2 :(得分:2)

首先,您应该使用threading模块,而不是线程模块。接下来,让你的主线程join()为其他线程。