我正在为令牌环LAN写一个模拟,并试图在一个单独的线程中运行一个计时器到我的主程序,以检查从监视器接收“活动状态”的时间。我在其他节点之前启动监控程序,它们在发送和“活动状态”之前都有相同的等待时间,或者开始选择新监视器,但节点程序似乎在监视器之前超时。
这只是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()
答案 0 :(得分:2)
由于Python的全局解释器锁(GIL)线程永远不会同时执行。相反,一个线程获得一段执行时间,而所有其他线程都被锁定(它们没有执行任何代码)。这就是为什么对time.time()的调用仅与分配给线程的最小时间片一样准确。
看看David Beazley的工作,以便更好地理解线程如何在Python中工作:http://www.dabeaz.com/GIL/他表明,根据Python的版本,您使用线程可以被阻止几秒钟,然后才能重新获取GIL。在这种情况下,你的time.time()调用会在相同的时间内关闭。
如果您想要更高的准确度,您应该考虑使用流程而不是线程。在多处理模块的帮助下,它们的使用并不比Python中的线程复杂:http://docs.python.org/3.3/library/multiprocessing.html