Parallel Python:将另一个模块中编写的函数传递给“submit”

2024-10-03 23:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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())

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

Traceback (most recent call last):

File "", line 1, in ser.submit(walk, (1000, params), modules = ("walkerc",), globals = globals())

File "/usr/lib/python2.7/site-packages/pp.py", line 458, in submit sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)

File "/usr/lib/python2.7/site-packages/pp.py", line 629, in __dumpsfunc sources = [self.__get_source(func) for func in funcs]

File "/usr/lib/python2.7/site-packages/pp.py", line 696, in __get_source sourcelines = inspect.getsourcelines(func)[0]

File "/usr/lib/python2.7/inspect.py", line 690, in getsourcelines lines, lnum = findsource(object)

File "/usr/lib/python2.7/inspect.py", line 526, in findsource file = getfile(object)

File "/usr/lib/python2.7/inspect.py", line 420, in getfile 'function, traceback, frame, or code object'.format(object))

TypeError: '<'built-in function walk'>' is not a module, class, method, function, traceback, frame, or code object

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

如何正确指定函数名'walk'? 我不想在我称之为'walk'的同一个文件中定义它,因为我在Cython中修改了它,并希望有更好的性能。有其他选择吗?在


Tags: 函数inpyobjectlibusrlineser
1条回答
网友
1楼 · 发布于 2024-10-03 23:29:22

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

我可以像这样在我的系统上成功地传递导入的walk函数,这里没有冲突,也没有更多需要的东西,该函数使用给定的参数执行:

import pp
from walkerc import walk

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

但是传递^{},这肯定是一个内置函数:

^{pr2}$

我得到和你完全一样的错误:

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)

相关问题 更多 >