在 运行 python 进程中添加到列表

Adding to a list in a running python process

我有一个继承自 multiprocessing.Process 的 class Feed,其中有一个列表。虽然进程是 运行,但我需要能够添加到此列表中。这可能吗?

class Feed(multiprocessing.Process):
    def __init__(self, user: str, feed_id: str, feed_name: str):
        super(Feed, self).__init__()

        self._user = user
        self._feed_id = feed_id
        self._feed_name = feed_name

        self._connected_servers_store = []


    def add_server(self, server_ip: str) -> None:
        self._connected_servers_store.append(server_ip)

    def run(self) -> None:
        while True:
            print(self._connected_servers_store)

我希望能够做到这一点,但无法在网上找到处理此类情况的任何内容。出于此应用程序的目的,IP 地址不能硬编码。

def main():
    feed = Feed(user='1234', feed_id='12345', feed_name='Feed 1')

    feed.start()

    feed.add_server('127.0.0.1')
    feed.add_server('<IP_ADDRESS>')
    feed.add_server('<IP_ADDRESS>')

if __name__ == '__main__':
    main()

当程序是运行时,打印的只是一个空列表。

您的问题在于进程之间共享变量。这里发生的是您的进程 1(主进程)创建了 class 对象,然后该对象生成了另一个进程 2,您的 run 函数将在其中执行。您是如何编写代码的 add_server 修改进程 1 space 中的对象,然后在进程 2 中打印。

这可以通过使用管理员来解决。

考虑这个版本的代码(省略不相关的部分):

def __init__(self, user: str, feed_id: str, feed_name: str):    
    super(Feed, self).__init__()
    self._user = user
    self._feed_id = feed_id
    self._feed_name = feed_name
    self._connected_servers_store = multiprocessing.Manager().list()

def add_server(self, server_ip: str) -> None:
    self._connected_servers_store.append(server_ip)

def run(self) -> None:
    while True:
        print ("---")
        for i in self._connected_servers_store:
            print(i)
        sleep(0.5)

现在可以正常使用了。如果我没记错的话,如果 Windows 上的 运行 还需要添加一些额外的代码行(如果这些代码不存在,你会得到异常)但我不是 Windows 大师和可能是错误的。

注意:要使其正常工作,您必须采取措施防止主进程退出。您当前的 main 会出现异常,因为您的主进程在添加 IP 地址后退出并且管理器已删除。

这是示例代码中的快速修复。无论如何,使用您的主程序来确保子进程按顺序关闭并且它们的异常处理到位是一种很好的编程习惯。如果没有 sleep 调用,你会从 Manager.

得到模糊的异常
feed.add_server('127.0.0.1')
feed.add_server('<IP_ADDRESS>')
feed.add_server('<IP_ADDRESS>')
sleep(30)