首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread._wait_for_tstate_lock()永不返回

Thread._wait_for_tstate_lock()永不返回
EN

Stack Overflow用户
提问于 2017-11-06 23:04:24
回答 1查看 9.3K关注 0票数 13

当我点击Ctrl+C时,我的程序似乎处于死锁状态。我试图捕捉键盘中断,优雅地停止所有运行的线程,但我还没有完全做到这一点。

我用的是concurrent.futures.ThreadPoolExecutor。为了找到死锁的位置,我使用了来自ActiveState的ActiveState。

下面是完整的堆栈跟踪:

代码语言:javascript
复制
# ThreadID: 4856
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\threading.py", line 884, in _bootstrap
  self._bootstrap_inner()
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\threading.py", line 916, in _bootstrap_inner
  self.run()
File: "C:\Users\niklas\repos\nodepy\craftr\lib\utils\tracer.py", line 66, in run
  self.stacktraces()
File: "C:\Users\niklas\repos\nodepy\craftr\lib\utils\tracer.py", line 80, in stacktraces
  fout.write(stacktraces())
File: "C:\Users\niklas\repos\nodepy\craftr\lib\utils\tracer.py", line 28, in stacktraces
  for filename, lineno, name, line in traceback.extract_stack(stack):

# ThreadID: 6068
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\runpy.py", line 193, in _run_module_as_main
  "__main__", mod_spec)
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\runpy.py", line 85, in _run_code
  exec(code, run_globals)
File: "C:\Users\niklas\repos\nodepy\craftr\.nodepy_modules\.bin\craftr.exe\__main__.py", line 9, in <module>
  sys.exit(nodepy.main.main())
File: "c:\users\niklas\repos\nodepy\nodepy\nodepy\main.py", line 103, in main
  ctx.load_module(ctx.main_module, do_init=False)
File: "c:\users\niklas\repos\nodepy\nodepy\nodepy\context.py", line 253, in load_module
  module.load()
File: "c:\users\niklas\repos\nodepy\nodepy\nodepy\loader.py", line 43, in load
  exec(code, vars(self.namespace))
File: "C:\Users\niklas\repos\nodepy\craftr\lib\main.py", line 110, in <module>
  sys.exit(main())
File: "C:\Users\niklas\repos\nodepy\craftr\lib\main.py", line 106, in main
  return backend.build_main(backend_args, session, module)
File: "C:\Users\niklas\repos\nodepy\craftr\lib\build_backends\default.py", line 194, in build_main
  executor.run(actions)
File: "C:\Users\niklas\repos\nodepy\craftr\lib\build_backends\default.py", line 171, in run
  self.wait()
File: "C:\Users\niklas\repos\nodepy\craftr\lib\build_backends\default.py", line 137, in wait
  self.pool.shutdown(wait=True)
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\concurrent\futures\thread.py", line 144, in shutdown
  t.join()
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\threading.py", line 1056, in join
  self._wait_for_tstate_lock()
File: "c:\users\niklas\appdata\local\programs\python\python36\lib\threading.py", line 1072, in _wait_for_tstate_lock
  elif lock.acquire(block, timeout):

我从这次追踪中弄不明白。Thread._wait_for_tstate_lock()似乎从未返回(我多次检查,它总是挂在该行上)。除了主线程(6068)和跟踪线程(4856)之外,没有运行其他线程。

我不太明白threading.Thread的实现细节。什么会导致Thread._tstate_lock.acquire()无限期地阻塞?

更新2017/11/07 -01:45

这似乎发生在pool.shutdown()被多次调用时.

EN

回答 1

Stack Overflow用户

发布于 2019-04-12 01:21:31

我不能百分之百肯定这是您在使用Windows时看到这种情况的原因,但是在类似的场景中,我在Linux上遇到了Python3.6。

我在concurrent.futures.ThreadPoolExecutor上使用了concurrent.futures.ThreadPoolExecutor,程序似乎挂掉了。有时它最终会在30-60秒后退出。

Ctrl-C总是产生一个跟踪显示它是坐在_wait_for_tstate_lock()

注释:在Python3中,第二个Ctrl实际上退出了

当提交的函数在循环中使用time.sleep()时,我的问题就发生了。

查看github上当前节点代码中的HtmlFileTracer实现,我看到了一个与我正在做的类似的场景(除非设置了某种标志,否则连续循环和间隔睡眠)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47147328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档