python - 导入锁在 pypy 中不能跨线程工作

标签 python multithreading pypy

该测试在 python2.6/2.7 下通过,但在 pypy 下失败。 pypy 绝对支持线程,并且 imp 锁似乎可以按照 pypy 下的预期在没有线程的情况下工作。看起来线程正在获取自己的导入锁?......

import unittest
import imp
import threading


class Test(unittest.TestCase):

    def test_import_lock(self):
        lock_held = threading.Event()
        test_complete = threading.Event()
        lock_released = threading.Event()

        def other_thread():
            imp.acquire_lock()

            assert imp.lock_held()  # <--- this assertion passes, the imp lock is definitely held

            lock_held.set()
            test_complete.wait()
            imp.release_lock()

            lock_released.set()

        t = threading.Thread(target=other_thread)
        t.setDaemon(True)
        t.start()

        # Wait until the thread is holding the import lock
        lock_held.wait()

        # The import lock should be held at this point. The thread even asserted
        # that it was held!
        lock_was_held = imp.lock_held()

        # Notify the thread to release the lock
        test_complete.set()

        # Wait for the lock to be released
        lock_released.wait()

        # Make sure the lock was held when we expected it to be held
        assert lock_was_held

if __name__ == '__main__':
    unittest.main()

pypy

struys$ python --version
Python 2.7.6 (394146e9bb67, May 08 2014, 16:45:59)
[PyPy 2.3.0 with GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]
struys$ python -m test
F
======================================================================
FAIL: test_import_lock (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 42, in test_import_lock
    assert lock_was_held
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

python 2.7

struys$ python --version
Python 2.7.2
struys$ python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

最佳答案

看起来 PyPy 的实现返回该线程是否持有锁:https://bitbucket.org/pypy/pypy/src/6e9376d22e0ecc83bfcdda81d0e37e695b435dd7/pypy/module/imp/importing.py?at=default#cl-753

而 CPython 返回是否持有锁: http://hg.python.org/cpython/file/3a1db0d2747e/Python/import.c#l348

所以这看起来是 PyPy 中的一个真正的错误,我已经将其标记为:https://bitbucket.org/pypy/pypy/issue/1775/implock_held-isnt-quite-right

关于python - 导入锁在 pypy 中不能跨线程工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23816549/

相关文章:

python - "TypeError": 'list' object is not callable flask

objective-c - 重复更新 UIImage 未显示在屏幕上

java - 如何确保游戏在其他计算机上运行速度不会更快?

python - pypy 的 dict 线程安全吗?

python - pypy import clr 在 Windows 上失败

用于创建和合并数据库数据透视表的 Python Pandas For 循环

python - 减去 Pandas 或 Pyspark Dataframe 中的连续列

python - 删除没有值的字典条目 - Python

java - 触发事件时自发的 NullPointerExceptions

python - pip install 编译成功后执行导入错误