该测试在 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/