Как синхронизировать потоки в Python?
У меня есть два потока в 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 ответа
Thread
подразумевается как примитивный интерфейс более низкого уровня для механизма потоков Python - используйте threading
вместо. Затем вы можете использовать threading.join()
синхронизировать темы.
Другие потоки могут вызывать метод join() потока. Это блокирует вызывающий поток до тех пор, пока поток, чей метод join() вызывается, не завершится.
Ты можешь сделать что-то подобное:
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) будут ожидать друг друга.
Во-первых, вы должны использовать модуль потоков, а не модуль потоков. Затем ваш основной поток присоединится к другим потокам.