有沒有什麼辦法可以在greenlet和ThreadPool線程之間共享一個鎖?在ThreadPool線程之間共享gevent鎖/信號量?
具體來說,我的應用程序主要是GEVENT爲主,但有些部分需要在「真實」的線程中運行......但是這出現問題的原因logging
處理程序,因爲他們使用一個信號燈周圍的一些操作,產生類似的例外:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 1300, in callHandlers hdlr.handle(record) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 742, in handle self.acquire() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 693, in acquire self.lock.acquire() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 128, in acquire rc = self.__block.acquire(blocking) File "_semaphore.pyx", line 112, in gevent._semaphore.Semaphore.acquire (gevent/gevent._semaphore.c:2984) File "…/gevent/hub.py", line 331, in switch return greenlet.switch(self) LoopExit: This operation would block forever
這正在發生,我懷疑,當線程一個持有鎖,那麼線程乙試圖獲取它。在注意到鎖已被佔用時,線程B嘗試hub.switch()
...但由於在線程B的hub
中只有一個綠色小程序,因此引發了「永遠阻塞」異常。
所以!對此有什麼可以做的嗎?或者我卡住了?
我遇到了一個非常類似的問題,https://github.com/numba/numba/issues/1556。真的很高興看到這個解決方案。 – Michael