Python 3.x python多处理锁和队列不适用于较旧的Linux内核

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

我有一台运行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 = 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

我用线程库替换了多处理库,现在锁和队列的所有问题都得到了解决,代码在旧内核上的执行方式与在新内核上的执行方式相同

我仍然无法解释到底是什么造成了这种差异,以及为什么多处理、队列和多处理、锁在较新的内核上工作得很好,但在较旧的内核上却不行