Python 3.x python多处理锁和队列不适用于较旧的Linux内核
我有一台运行linux 32位的实时机器,内核为4.9.124-rt94-rc1-mx6-sr+g79f5711,由Yocto项目构建。还有第二台运行32位linux、内核为3.18.48-rt54-yocto-standard的旧机器,也是用yocto项目创建的 我有两个简短的python脚本。 第一:Python 3.x python多处理锁和队列不适用于较旧的Linux内核,python-3.x,linux,locking,posix,yocto,Python 3.x,Linux,Locking,Posix,Yocto,我有一台运行linux 32位的实时机器,内核为4.9.124-rt94-rc1-mx6-sr+g79f5711,由Yocto项目构建。还有第二台运行32位linux、内核为3.18.48-rt54-yocto-standard的旧机器,也是用yocto项目创建的 我有两个简短的python脚本。 第一: from multiprocessing import Queue, Lock if __name__ == "__main__": flag_lock = Lo
from multiprocessing import Queue, Lock
if __name__ == "__main__":
flag_lock = Lock()
flag_lock.acquire()
flag_lock.release()
第二点:
import multiprocessing as mp
if __name__ == "__main__":
test = mp.Queue()
print("hello")
test.put(3)
print("world")
这两个脚本在具有4.9.124-rt94-rc1-mx6-sr+g79f5711内核的较新计算机上运行良好
在具有旧内核的计算机上执行第一个脚本将引发异常:
回溯(最近一次呼叫最后一次):
文件“/temp_lock.py”,第8行,在
flag_lock.release()
ValueError:信号量或锁释放次数过多
在使用旧内核的机器上执行第二个脚本将打印“hello”,并将在test.put(3)上无限期地卡住
考虑到队列是线程安全的,我假设其中的一些锁定机制失败了
我使用Python3.6.0和Python3.8.3在这两台机器上以相同的结果执行这些脚本
我在第一个脚本(带锁的脚本)上使用了strace,我发现的主要区别是在旧的机器上
ioctl(3,TCGETS,0xbfe94f4c)=-1 ENOTTY(设备的ioctl不适当)持续失败57次
我还注意到调用了fstat64(),由此我得出结论,在多处理模块中植入锁是POSIX我用线程库替换了多处理库,现在锁和队列的所有问题都得到了解决,代码在旧内核上的执行方式与在新内核上的执行方式相同 我仍然无法解释到底是什么造成了这种差异,以及为什么多处理、队列和多处理、锁在较新的内核上工作得很好,但在较旧的内核上却不行