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在单核和多核计算机上具有相同的性能。在以前的版本中,您拥有的内核/线程越多,性能损失就会增加…
希望能帮助到你 :)