2014-05-22 15 views
2

該測試通過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 
+0

你有lock_held變量命名和一個叫做imp.lock_held的imp方法。這可能會讓讀者感到困惑,但不是問題的原因。 – Jim

回答

3

看起來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

+2

這個錯誤已被修復爲'default'。 –