【问题标题】:Python: how to share an object instance across multiple invocations of a scriptPython:如何跨脚本的多次调用共享对象实例
【发布时间】:2011-06-26 01:34:34
【问题描述】:

我正在使用一个为外部程序提供 python 接口的库。这允许我创建:

foo = Foo()

上面的代码启动了一个新的 Foo 程序实例,我可以在 python 中控制它。

我有一个需要多次调用的 python 脚本,并且根据外部参数,告诉外部 Foo 程序的单个实例执行不同的操作。显然我做不到

foo = Foo() 每次,

因为每次我的脚本运行时都会创建一个新的 Foo 实例。

我想做的是创建一次foo= Foo(),并让多个调用共享同一个实例。目前我想只创建一次,序列化它,然后让我的脚本反序列化它。这种方法有效吗?有更好的选择吗?

谢谢!!

【问题讨论】:

    标签: python object-persistence object-sharing


    【解决方案1】:

    如果您采用类似于this answer 中给出的方法,则可以做到这一点。或者你可以使用Pyro,这与this answer中的多处理相比。

    【讨论】:

      【解决方案2】:

      您也许可以使用pickle。这是一个简单的例子:

      import os, pickle
      
      class Foo(object):
          def __init__(self, bar):
              self.bar = bar
      
      # use previous pickled instance if found
      if os.path.exists('foo.pickle'):
          with open('foo.pickle') as f:
              foo = pickle.load(f)
      else:
          foo = Foo(42)
      
      # print current foo.bar
      print foo.bar
      
      # change foo.bar and pickle
      foo.bar = raw_input('new bar: ')
      with open('foo.pickle', 'w') as f:
          pickle.dump(foo, f)
      

      【讨论】:

      • 我实际上尝试过这样做,我收到一条消息说“无法腌制'锁定'对象:”。我现在正在调查。
      • 是的,它有一些限制,您可能/可能无法解决您想做的事情:docs.python.org/library/…
      • 如果您使用锁,您可能需要采用其他路径(如套接字或管道)来提供对您的类的锁定访问
      【解决方案3】:

      您可以更改设计,使Foo() 仅将您连接到现有流程,然后创建一个新函数,将其称为您之前调用一次的startFoo()(或者如果Foo() 失败)。更好的做法是让 Foo() 连接到您通过套接字连接到的服务的程序。您可能还想切换到多处理模块。

      【讨论】:

      • 是的,我认为这就是我必须要做的,因为我无法轻松序列化 Foo 对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多