【问题标题】:How to close a multiprocessing connection listener?如何关闭多处理连接侦听器?
【发布时间】:2021-09-14 21:50:42
【问题描述】:

我需要多处理方面的帮助。我很新,我主要是在尝试一些东西。所以我有这个监听器正在监听输入。我想在关机时优雅地关闭程序,但由于程序卡在 listener.accept() 处,我无能为力。

listener = multiprocessing.connection.Listener(('localhost', 6000))

def exit_gracefully():
    print("test")
    listener.close()
    # Do cleanup and exit

signal.signal(signal.SIGTERM, exit_gracefully)

while True:
    conn = listener.accept()
    # Do stuff.

我向进程发送了 sigterm,但我从未看到“测试”被打印出来。请帮帮我。

【问题讨论】:

标签: python multiprocessing connection listener


【解决方案1】:

首先,您应该发布minimal, reproducible example,这意味着我应该能够复制、粘贴和运行您的代码,而无需进一步重现您的问题。但是您显然缺少必需的 import 语句。我特意把这件事告诉你,作为你未来帖子的首次海报。

multiprocessing.connection.Listener 被各种类使用。问题是您在没有人说话的端口上创建了一个侦听器!您应该注册一个在 Python 退出时调用的函数,使用 atexit.register 来处理任何原因的终止。处理 SIGTERM 需要将 Unix/Linux kill 命令发送到进程。

import atexit
import signal
import time
import sys

def exit_gracefully():
    print("test")

def ctrl_c_hit(*args, **kwargs):
    print('CTRL-c hit!')
    sys.exit(0)

atexit.register(exit_gracefully)

# intercept CTRl-c
signal.signal(signal.SIGINT, ctrl_c_hit)

print('Enter CTRL-c to terminate ...')
while True:
    time.sleep(1_000_000)

如果你输入CTRL-C,你会看到:

Enter CTRL-c to terminate ...
CTRL-c hit!
test

【讨论】:

  • 这没有很好地回答您的问题吗?
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2011-12-02
  • 2020-08-31
相关资源
最近更新 更多