Python time.time() 在并发程序中的可靠性

5 投票
1 回答
596 浏览
提问于 2025-04-17 20:18

我正在写一个模拟程序,用来模拟令牌环局域网(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

撰写回答