該測試通過python2.6/2.7下,但在pypy下失敗。 pypy肯定支持線程,並且imp進程似乎在沒有線程的情況下按照預期在pypy下運行。這似乎是線程得到它自己的進口鎖?....導入鎖不能在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)
蟒蛇2.7
struys$ python --version
Python 2.7.2
struys$ python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
你有lock_held變量命名和一個叫做imp.lock_held的imp方法。這可能會讓讀者感到困惑,但不是問題的原因。 – Jim