并行Python:将另一个模块中编写的函数传递给'submit'

时间:2014-06-24 10:16:29

标签: python parallel-processing parallel-python

我正在使用Parallel Python模块(pp),并希望向工作人员提交作业。但是,我想要执行的函数是在另一个模块中(用Cython编写),我不知道如何将函数名称导入新的worker。方法建议here,即导入函数内部的“walkerc”模块无法工作,因为walk本身是在walkerc中定义的,来自文件名“walkerc.so”

import pp
from walkerc import walk
# Other stuff here
ser = pp.Server()
# Some more definitions
ser.submit(walk, (it, params))
ser.submit(walk, (1000, params), modules = ("walkerc",), globals = globals())

上述两个语句都失败了,我收到以下错误:

  

追踪(最近一次呼叫最后一次):

     

文件“”,第1行,in       ser.submit(walk,(1000,params),modules =(“walkerc”,),globals = globals())

     

文件“/usr/lib/python2.7/site-packages/pp.py”,第458行,提交       sfunc = self .__ dumpsfunc((func,)+ depfuncs,modules)

     

文件“/usr/lib/python2.7/site-packages/pp.py”,第629行,   __dumpsfunc       sources = [self .__ get_source(func)for func in funcs]

     

文件“/usr/lib/python2.7/site-packages/pp.py”,第696行,   __get_source       sourcelines = inspect.getsourcelines(func)[0]

     

文件“/usr/lib/python2.7/inspect.py”,第690行,在getsourcelines中       lines,lnum = findsource(object)

     

文件“/usr/lib/python2.7/inspect.py”,第526行,在findsource中       file = getfile(object)

     

文件“/usr/lib/python2.7/inspect.py”,第420行,在getfile中       'function,traceback,frame or code object'.format(object))

     

TypeError:'<'内置函数walk'>'不是模块,类,方法,   函数,回溯,框架或代码对象

函数'walk'本身是在主程序中正确导入的,它是将它提交给有问题的新工作者的过程。

如何正确指定功能名称'walk'? 我不想在我调用它的同一个文件中定义'walk',因为我已经在Cython中对其进行了修改并希望获得更好的性能。还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

尝试将walk功能重命名为其他功能,例如mywalk。正如异常文本所示,您的环境似乎有一个名为walk的内置函数,因此inspect模块会混淆。

我可以在我的系统上成功传递我这样导入的walk函数,这里没有冲突而且不再需要,使用给定的参数执行函数:

import pp
from walkerc import walk

pps = pp.Server()
pps.submit(walk, args=(1,))

但是传递dir,这是一个内置函数肯定:

pps.submit(dir)

我得到与你完全相同的错误:

Traceback (most recent call last):
  File "parallel.py", line 9, in 
    pps.submit(dir)
  ...
  File ".../lib/python2.7/inspect.py", line 420, in getfile
    'function, traceback, frame, or code object'.format(object))
TypeError:  is not a module, class, method, function, traceback, frame, or code object

以下讨论后更新:

因此,问题在于Python将来自C extensions的成员视为内置函数。上面的代码适用于常规Python模块,但是当从C扩展中导入和传递函数时,我能够复制OP的错误。

因此,我将C扩展函数调用包装在一个普通的Python函数中,这样就可以了。请注意,现在walk函数导入已移至包装函数,因此它可以在调度时构建它自己的上下文。

import pp

def walk(n):
    import walkerc
    return walkerc.walk(n)

def print_callback(result):
    print('callback: ', result)

pps = pp.Server()
job = pps.submit(walk, args=(1,), callback=print_callback)