首页 > 解决方案 > 如何关闭多处理连接侦听器?

问题描述

我需要多处理方面的帮助。我很新,我主要是在尝试一些东西。所以我有这个监听器正在监听输入。我想在关机时优雅地关闭程序,但由于程序卡在 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 发送到该过程,但我从未看到“测试”被打印出来。请帮帮我。

标签: pythonmultiprocessingconnectionlistener

解决方案


首先,您应该发布了一个最小的、可重现的示例,这意味着我应该能够复制、粘贴和运行您的代码,而无需进一步重现您的问题。但是您显然缺少必需的import陈述。我特意把这个告诉你,作为你未来帖子的第一次海报。

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

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

推荐阅读