代码之家  ›  专栏  ›  技术社区  ›  gatoatigrado

另一个与多处理错误混淆的是,“module”对象没有属性“f”

  •  59
  • gatoatigrado  · 技术社区  · 14 年前

    我知道这之前已经得到了回答,但是直接执行脚本“python filename.py”似乎不起作用。我在suse linux上有python 2.6.2。

    代码:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from multiprocessing import Pool
    p = Pool(1)
    def f(x):
        return x*x
    p.map(f, [1, 2, 3])
    

    命令行:

    > python example.py
    Process PoolWorker-1:
    Traceback (most recent call last):
    File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
        self.run()
    File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
        self._target(*self._args, **self._kwargs)
    File "/usr/lib/python2.6/multiprocessing/pool.py", line 57, in worker
        task = get()
    File "/usr/lib/python2.6/multiprocessing/queues.py", line 339, in get
        return recv()
    AttributeError: 'module' object has no attribute 'f'
    
    5 回复  |  直到 6 年前
        1
  •  115
  •   Bartosz    14 年前

    重新构造代码,以便 f() 函数是在创建池实例之前定义的。否则工人看不到您的功能。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from multiprocessing import Pool
    
    def f(x):
        return x*x
    
    p = Pool(1)
    p.map(f, [1, 2, 3])
    
        2
  •  5
  •   Tamás    14 年前

    这个有效:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from multiprocessing import Pool
    
    def f(x):
        return x*x
    
    if __name__ == "__main__":
        p = Pool(1)
        p.map(f, [1, 2, 3])
    

    我不确定为什么你的代码不能工作,但我想原因是 multiprocessing 模块尝试导入主模块(以访问您定义的方法),然后 if __name__ == "__main__" 节不需要在设置池的位置执行初始化代码。

        3
  •  1
  •   user1143523    12 年前

    一种可能是python文件与模块同名:

    • Py
    • 试验/
      • π介子

    在pickle.py中,错误来自:

        def find_class(self, module, name):
          # Subclasses may override this
          __import__(module)
          mod = sys.modules[module] # <- here mod will reference your test/__init__.py
          klass = getattr(mod, name)
          return klass
    
        4
  •  0
  •   Pluto    11 年前

    我的问题通过使用 if __name__ == "__main__" 正如tam's所指出的,在eclipse for windows中,示例在解释器下不起作用。 这在 http://docs.python.org/2/library/multiprocessing

        5
  •  0
  •   Y K    6 年前

    这是因为 p = Pool(1) 主进程在创建函数f之前分叉进程(线程与进程)。正如bartosz中所述,派生进程没有访问新函数的权限。

    def f1(x):
        ...
    
    p = Pool(1) # p is spawned and is now an independent process, knows f1
    
    def f(x): # p doesn't not share this object
        ...