Python time.time() 在并发程序中的可靠性
我正在写一个模拟程序,用来模拟令牌环局域网(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()
1 个回答
2
由于Python有一个叫做全局解释器锁(GIL)的东西,线程是不会同时执行的。简单来说,就是一个线程在运行的时候,其他线程都被锁住了,不能执行任何代码。所以,当你调用time.time()的时候,它的准确性只和分配给线程的最小执行时间有关。
想要更深入了解Python中的线程工作原理,可以看看David Beazley的研究:http://www.dabeaz.com/GIL/。他展示了根据你使用的Python版本,线程可能会被锁住几秒钟,才能重新获得GIL。在这种情况下,你的time.time()调用的时间就会偏差相同的时间。
如果你想要更高的准确性,可以考虑使用进程而不是线程。使用进程在Python中并不比线程复杂,特别是有了multiprocessing模块的帮助:http://docs.python.org/3.3/library/multiprocessing.html