【问题标题】:pypi cproto (chrome debugging client) hangs on exitpypi cproto(chrome调试客户端)在退出时挂起
【发布时间】:2021-03-11 11:59:24
【问题描述】:

使用https://pypi.org/project/cproto/,附加到在Docker容器中无头运行的Chrome,我发现它有时会卡住(下面引用的示例不可靠-您可能需要运行几次):

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cproto
>>> cp = cproto.CProto()   # localhost:9222 == my Chrome container
>>> cp.close()
>>> exit()
^CException ignored in: <module 'threading' from '/usr/lib/python3.6/threading.py'>
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 1294, in _shutdown
    t.join()
  File "/usr/lib/python3.6/threading.py", line 1056, in join
    self._wait_for_tstate_lock()
  File "/usr/lib/python3.6/threading.py", line 1072, in _wait_for_tstate_lock
    elif lock.acquire(block, timeout):
KeyboardInterrupt
$

Chrome 在 Docker 外部正常运行时也会发生这种情况。

不管 Chrome 可能遇到什么麻烦,cproto 库应该像这样陷入困境似乎有点“离题”。

有什么方法可以强制退出cproto吗?(是不是我上面做错了什么,或者这是一个bug?)

【问题讨论】:

    标签: python python-3.x google-chrome-devtools chrome-debugging


    【解决方案1】:

    在主线程退出后,一些非守护线程似乎仍在运行。这项工作对我有用(尚未找到根本原因,需要更多调查):

    diff -ur cproto.orig/core/websocket.py cproto/core/websocket.py
    --- cproto.orig/core/websocket.py       2021-01-04 01:24:53.000000000 +0000
    +++ cproto/core/websocket.py    2021-03-10 04:10:32.228436532 +0000
    @@ -38,8 +38,16 @@
         def connect(self, *args, **kwargs):
             super(self.__class__, self).connect(*args, **kwargs)
     
    -        threading.Thread(target=self._read_messages).start()
    -        threading.Thread(target=self._process_events).start()
    +        # threading.Thread(target=self._read_messages).start()
    +        # threading.Thread(target=self._process_events).start()
    +
    +        t1 = threading.Thread(target=self._read_messages)
    +        t1.setDaemon(True)
    +        t1.start()
    +
    +        t2 = threading.Thread(target=self._process_events)
    +        t2.setDaemon(True)
    +        t2.start()
     
         def close(self):
             # Terminates blocking `get` call on events processing thread
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2015-08-20
      • 2018-04-27
      • 1970-01-01
      • 2014-07-28
      相关资源
      最近更新 更多