当我按Ctrl+C时,我的程序有时似乎在死锁中运行。我试图捕捉键盘中断并优雅地停止所有正在运行的线程,但我还没有完全做到这一点。在
我用的是concurrent.futures.ThreadPoolExecutor
。为了找到死锁的位置,我使用ActiveState中的this receipe。在
下面是完整的stacktrace:
# 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 CEWT
当多次调用pool.shutdown()
时,似乎会发生这种情况。。。在
我不能百分之百地肯定这是您在使用Windows时看到这种情况的原因,但是我在使用python3.6的Linux上遇到了类似的情况。在
我在一个
concurrent.futures.ThreadPoolExecutor
上使用.shutdown()
,程序似乎挂断了。 有时它会在30-60秒后退出。在Ctrl-C总是导致回溯,显示它位于
_wait_for_tstate_lock()
注意:在python3中,第二个Ctrl-C实际上会退出
当提交的函数在循环中使用
time.sleep()
时,出现了问题。在查看github上当前nodepy代码中的
HtmlFileTracer
实现,我看到了与我所做的类似的场景(除非设置了某种标志,否则会持续循环并休眠一段时间)相关问题 更多 >
编程相关推荐