【问题标题】:ProcessPoolExectur and Ctrl CProcessPoolExecutor 和 Ctrl C
【发布时间】:2021-10-24 09:08:35
【问题描述】:

我在 Windows 10 上使用 ProcessPoolExecutor。Python 版本是 3.9.5。 当我按 Ctrl+C 两次时,即使我设置了超时,程序也会无休止地挂起。

with concurrent.futures.ProcessPoolExecutor() as executor:
    results = executor.map(Worker, iterable, timeout=5)
    try:
        for result in results:
            DoSomething(result)
    except Exception as exc:
        print(exc)
        executor.shutdown(wait=True, cancel_futures=True)

错误信息是:

  ...
  File "C:\Python\foo.py", line 162, in FooFunc
    executor.shutdown(wait=True, cancel_futures=True)
  File "C:\Python\_envs\Python39\lib\concurrent\futures\_base.py", line 636, in __exit__
    self.shutdown(wait=True)
  File "C:\Python\_envs\Python39\lib\concurrent\futures\process.py", line 740, in shutdown
    self._executor_manager_thread.join()
  File "C:\Python\_envs\Python39\lib\threading.py", line 1033, in join
    self._wait_for_tstate_lock()
  File "C:\Python\_envs\Python39\lib\threading.py", line 1049, in _wait_for_tstate_lock
    elif lock.acquire(block, timeout):
KeyboardInterrupt

【问题讨论】:

    标签: python process-pool


    【解决方案1】:

    我找到了解决方案。一种解决方法。这有点奇怪,因为我希望 Python 标准实现已经能够处理 Ctrl+C。

    解决方法是添加到主进程中:

    def handler(signum, frame):
        print('Signal handler called with signal', signum)
    
    
    if __name__ == "__main__":
        import signal
        signal.signal(signal.SIGINT, handler)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2011-06-29
      • 2016-05-25
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多