从另一个 class 杀死一个打开的套接字上的进程

Killing a process on an open socket from another class

好吧,我有一个程序可以打开到本地端口的套接字并启动进程,代码如下:

socket_opener.py

processes=[]
Handler = CGIHTTPServer.CGIHTTPRequestHandler
Handler.cgi_directories = ["/maps"]
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.server_name = "localhost"
httpd.server_port = 8008
processes.append(subprocess.Popen("ls"))
processes.append(subprocess.Popen("ls"))
httpd.serve_forever()

现在我想从上面声明的 processes 列表中的进程池中终止一个进程,所以我尝试了以下操作:

process_killer.py

from socket_opener import processes

遗憾的是,这是我所能做到的,因为它会引发此错误

socket.error: [Errno 98] Address already in use

还有什么方法可以做到这一点?

最直接的原因是您通过导入模块再次 运行 socket_opener 中的所有代码。这失败了,因为已经有一个套接字绑定到编号为 PORT 的端口,而您正试图绑定另一个。

(据我所知,您在创建对象后向对象添加了 server_nameserver_port 属性,这不会影响其操作。您真的应该提供一个完整的可验证示例(mcve)。)

但更大的问题是您似乎是在假设您可以在一个程序中定义一个列表 (socket_opener) 然后从另一个程序访问该列表 (process_killer) 的假设下操作.它不是那样工作的:第一个程序将在其自己的进程地址 space 中运行,与第二个程序的进程地址分开。第二个程序将无法访问第一个程序中的变量。

您需要将进程列表放在可从不同程序访问的某些外部对象中(文件、共享内存段或其他一些 IPC [进程间通信] 机制)。并且列表的形式必须是不同程序可以使用的形式:比方说,进程 ID 的文本列表,而不是包含 python [=17] 的 python list 对象=] 对象,none 其中在原始程序地址 space.

之外有意义