【问题标题】:Adding to a list in a running python process添加到正在运行的 python 进程中的列表
【发布时间】:2020-04-14 08:39:43
【问题描述】:

我有一个继承自 multiprocessing.Process 的类 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()

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

【问题讨论】:

  • 您在这里尝试/发布的代码有问题吗?
  • 如果您的意思是问题中的代码有问题,那么是的,它不会将 IP 添加到列表中。我应该指定,我将编辑问题。
  • 这个问题对你有帮助吗? stackoverflow.com/questions/38322574/…

标签: python python-multiprocessing


【解决方案1】:

您的问题在于进程之间共享变量。这里发生的是您的进程 1(主进程)创建类对象,然后生成另一个进程 2,您的 run 函数在其中执行。你是如何编写代码的,你的add_server 修改了进程 1 空间中的对象,然后你在进程 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 地址后退出并且管理器被删除。

这是示例代码中的快速修复。无论如何,使用你的主程序来确保子进程被有序关闭并且它们的异常处理到位是一种很好的编程习惯。如果没有睡眠呼叫,您将收到来自 Manager 的模糊异常。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2012-02-20
    • 2023-04-08
    相关资源
    最近更新 更多