Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Can';t使用多进程库导入自定义python模块_Python 2.7_Pickle_Python Multiprocessing - Fatal编程技术网

Python 2.7 Can';t使用多进程库导入自定义python模块

Python 2.7 Can';t使用多进程库导入自定义python模块,python-2.7,pickle,python-multiprocessing,Python 2.7,Pickle,Python Multiprocessing,刚刚开始使用我的代码库中的多处理库来并行化一个简单的for循环,在此之前,在串行for循环中,我将导入一个自定义配置.py文件,并将其传递为要运行的函数 但是,我在传递要并行化的配置模块时遇到了问题 注意。有多个自定义configuration.py,我希望将其传递到不同的进程中 例如: def get_custom_config(): config_list = [] for project_config in configs: config = importlib

刚刚开始使用我的代码库中的
多处理
库来并行化一个简单的for循环,在此之前,在串行for循环中,我将导入一个自定义配置
.py
文件,并将其传递为要运行的函数

但是,我在传递要并行化的配置模块时遇到了问题

注意。有多个自定义
configuration.py
,我希望将其传递到不同的进程中

例如:

def get_custom_config(): 
   config_list = []
   for project_config in configs:
       config = importlib.import_module("config.%s.%s" % (prefix, project_config)
       config_list.append(config)
   return config_list

def print_config(config):
   print config.something_in_config_file

if __name__ = "__main__":
   config_list = get_custom_config()

   pool = mp.Pool(processes=2)
   pool.map(print_config, config_list)
返回:

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 567, in get
    raise self._value
cPickle.PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed
File“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,地图第251行
返回self.map\u async(func,iterable,chunksize).get()
get中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第567行
提升自我价值
cPickle.PicklingError:无法pickle:属性查找\内置\模块失败

将模块传递给并行进程的最佳方式是什么?

我确实为您提供了一个可能的解决方案,但我不喜欢您采用的方法

config = importlib.import_module("config.%s.%s" % (prefix, project_config)
您应该尝试将config作为键值对的字典,而不是作为模块。或者这样导入

问题是在Python 2.7中,
函数
模块
在默认情况下是不可拾取的。在Python3.X中,默认情况下函数是可拾取的,而模块仍然不是

import importlib
import multiprocessing as mp

configs = ["abc", "def"]
import copy_reg
import types


def _pickle_module(module):
    module_name = module.__name__
    print("pickling" + module_name)
    path = getattr(module, "__file__", None)
    return _unpickle_module, (module_name, path)


def _unpickle_module(module_name, path):
    return importlib.import_module(module_name)

copy_reg.pickle(types.ModuleType, _pickle_module, _unpickle_module)


def get_custom_config():
    config_list = []
    for project_config in configs:
        config = importlib.import_module("config.%s" % (project_config))
        config_list.append(config)
    return config_list


def print_config(config):
    print (vars(config))


if __name__ == "__main__":
    config_list = get_custom_config()

    pool = mp.Pool(processes=2)
    pool.map(print_config, config_list)
这基本上是在另一个过程中重新导入模块,因此请记住,您没有在它们之间共享数据。这是一个很好的只读变量

但正如我所提到的,将模块传递到不同的进程没有什么意义。尝试修正你的方法,而不是使用我发布的代码


PS:源于

的解决方案您想只使用python2.7还是也可以使用Python3?如果是这样的话,请将Python3作为well@TarunLalwani我只想在可能的情况下使用python2.7!如果我将模块用作只读模块,那么使用这种方法可以吗?或者这只是一种不好的做法,我应该按照你的建议,将模块导入字典,作为更好的做法?(也感谢您提供的工作代码!)您可以在运行时导入配置,没有任何问题。但是,当您向池发送
config\u list
时,它不应该包含模块,或者发送实际的配置,或者只传递模块名称,让每个进程加载自己的配置副本