Python:线程+锁定会大大降低我的应用程序运行速度


问题内容

说我有一个写入文件的函数。我也有一个循环循环读取该文件的功能。我有这两个函数在单独的线程中运行。(实际上,我正在通过MDIO读取/写入寄存器,这就是为什么我不能让两个线程同时执行,只能一个或另一个同时执行,但是为了简单起见,我们只说它是一个文件)

现在,当我单独运行write函数时,它会很快执行。但是,当我运行线程并在运行之前让它获取锁时,它的运行速度似乎非常慢。这是因为第二个线程(读取功能)正在轮询以获取锁吗?有什么办法可以解决这个问题?

我目前仅使用一个简单的RLock,但是愿意接受任何会提高性能的更改。

编辑:作为一个例子,我将举个例子。读线程基本上总是在运行,但是偶尔会有一个单独的线程来调用加载。如果我通过从cmd提示符运行负载进行基准测试,则在线程中运行的速度至少要慢3倍。

写线程:

import usbmpc # functions I made which access dll functions for hardware, etc

def load(self, lock):
    lock.acquire()
    f = open('file.txt','r')
    data = f.readlines()
    for x in data: 
        usbmpc.write(x)
    lock.release()

读取线程:

import usbmpc

def read(self, lock): 
    addr = START_ADDR
    while True: 
        lock.acquire()
        data = usbmpc.read(addr)
        lock.release()
        addr += 4
        if addr > BUF_SIZE: addr = START_ADDR

问题答案:

您是否在多核计算机上使用线程?

如果答案是肯定的,那么除非您的Python版本是3.2+,否则在运行线程化应用程序时,性能将下降。

大卫·比兹利(David
Beazly
)付出了巨大的努力来寻找多核GIL的发展趋势,并使我们其他人也很容易理解它。检查他的网站和那里的资源。另外,您可能想在PyCon
2010上看到他的演讲。这很有趣。

长话短说,在Python 3.2中,Antoine
Pitrou编写了一个新的GIL,该GIL在单核和多核计算机上具有相同的性能。在以前的版本中,您拥有的内核/线程越多,性能损失就会增加…

希望能帮助到你 :)