5

我正在为令牌环 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()
4

1 回答 1

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

于 2013-03-26T11:07:17.700 回答