2013-03-26 3 views
4

Я пишу симуляцию для локальной сети Token Ring и пытаюсь запустить таймер в отдельном потоке моей основной программы, чтобы проверить время ожидания получения «живого состояния» "с монитора. Я запускаю программу мониторинга перед другими узлами, и оба они имеют одно и то же время ожидания перед отправкой и «живым состоянием» или началом выбора нового монитора, но программа-узел, похоже, тайм-аут перед монитором.Python time.time() надежность в параллельных программах

Это просто проблема с параллелизмом в python или это скорее проблема с моим кодом?

Вот функция, прогоны нить, если вам нужно больше информации просто спросите

def timer(): 
    global reset 
    global ismonitor 
    global mToSend 
    global dataToSend 
    reset = time.time() 
    send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    while 1: 
     timer = time.time() 
     elapsed = timer - reset 
     if elapsed > 5: 
      if ismonitor: 
       mToSend = "110000" ## send around a token with a monitor alive flag on the broadcast channel 
       mToSend += maddr 
       dataToSend = True 
       reset = time.time() 
      else: 
       holdelection() 
       reset = time.time() 

ответ

1

Благодаря глобальной блокировки интерпретатора языка Python (GIL) потоки никогда не выполняются одновременно. Вместо этого один поток получает срез времени выполнения, а все остальные потоки блокируются (они не выполняют никакого кода). Вот почему вызов time.time() является настолько точным, как минимальный срез времени, назначенный потоку.

Посмотрите на работу Дэвида Бэзли, чтобы лучше понять, как работает потоки в Python: http://www.dabeaz.com/GIL/ Он показывает, что в зависимости от версии Python вы используете потоки, которые можно заблокировать в течение нескольких секунд, прежде чем они смогут повторно получить GIL. В этом случае ваш вызов time.time() будет отключен равным количеством времени.

Если вам нужна более высокая точность, вы должны рассмотреть возможность использования процессов вместо потоков. Они не сложнее использовать, чем потоки в Python с помощью модуля многопроцессорности: http://docs.python.org/3.3/library/multiprocessing.html

+0

Я знал, что они не были должным образом параллельными, но надеялись, что это не будет слишком большой проблемой, казалось бы, я был неправильно. Спасибо за ссылки и ответ. Я посмотрю на использование процессов и посмотрю, как это происходит. – Cob50nm

Смежные вопросы