这只是parallel-python标签的第二个问题。通过浏览文档和谷歌搜索主题,我来到这里,因为它是我得到答案和建议最好的运气。
以下是API(我认为它被称为)将所有相关信息提交给pp。
def submit(self, func, args=(), depfuncs=(), modules=(),
callback=None, callbackargs=(), group='default', globals=None):
"""Submits function to the execution queue
func - function to be executed
args - tuple with arguments of the 'func'
depfuncs - tuple with functions which might be called from 'func'
modules - tuple with module names to import
callback - callback function which will be called with argument
list equal to callbackargs+(result,)
as soon as calculation is done
callbackargs - additional arguments for callback function
group - job group, is used when wait(group) is called to wait for
jobs in a given group to finish
globals - dictionary from which all modules, functions and classes
will be imported, for instance: globals=globals()
"""
这是我的提交声明及其参数:
job_server.submit(reify, (pop1, pop2, 1000),
depfuncs = (key_seq, Chromosome, Params, Node, Tree),
modules = ("math",),
callback = sum.add, globals = globals())
depfuncs
中的所有大写名称都是类的名称。我不确定在何处放置类,或者即使我需要将它们包含在globals()
字典中。但是当我使用depfuncs()
为空运行它时,会引发错误,例如“Tree not defined
”(例如)。
现在,key_seq
是一个生成器,因此我必须使用它的一个实例才能使用.next()
:
def key_seq():
a = 0
while True:
yield a
a = a + 1
ks = key_seq()
ks
在globals()
中定义。当我没有在其他任何地方加入它时,我收到一条错误,上面写着“ks is not defined
”。
当我在ks
中加入depfuncs
时,这就是错误:
Traceback (most recent call last):
File "C:\Python26\Code\gppp.py", line 459, in <module>
job_server.submit(reify, (pop1, pop2, 1000), depfuncs = (key_seq, ks, Chromosome, Params, Node, Tree), modules = ("math",), callback = sum.add, globals = globals())
File "C:\Python26\lib\site-packages\pp.py", line 449, in submit
sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)
File "C:\Python26\lib\site-packages\pp.py", line 634, in __dumpsfunc
sources = [self.__get_source(func) for func in funcs]
File "C:\Python26\lib\site-packages\pp.py", line 713, in __get_source
sourcelines = inspect.getsourcelines(func)[0]
File "C:\Python26\lib\inspect.py", line 678, in getsourcelines
lines, lnum = findsource(object)
File "C:\Python26\lib\inspect.py", line 519, in findsource
file = getsourcefile(object) or getfile(object)
File "C:\Python26\lib\inspect.py", line 441, in getsourcefile
filename = getfile(object)
File "C:\Python26\lib\inspect.py", line 418, in getfile
raise TypeError('arg is not a module, class, method, '
TypeError: arg is not a module, class, method, function, traceback, frame, or code object
我很确定arg
指的是ks
。那么,我在哪里可以告诉.submit()
ks
?我不明白应该去哪里。感谢。
答案 0 :(得分:5)
你的方法看起来很复杂。在我的并行python程序中,我使用了以下调用:
job = jobServer.submit( doRun, (param,))
我是怎么逃避这个的?诀窍是doRun函数不会在与调用sumbit的上下文相同的上下文中运行。例如(人为的例子):
import os, pp
def doRun(param):
print "your name is %s!" % os.getlogin()
jobServer = pp.Server()
jobServer.submit( doRun, (param,))
此代码将失败。这是因为doRun中不存在os模块 - doRun不在与submit相同的上下文中运行。确定,您可以在os
的{{1}}参数中传递module
,但是在doRun中调用submit
是不是更容易?
parallel python试图通过在一个完全独立的进程中运行你的函数来避免python的GIL。它试图通过让你引用“传递”参数和命名空间到你的函数来使这更容易吞下,但它使用hacks来做到这一点。例如,您的类将使用import os
的某个变体进行序列化,然后在新进程中进行反序列化。
但是,不要依赖于pickle
的黑客,只要接受你的功能需要完成设置它的运行上下文的所有工作的现实。你真的有两个submit
函数 - 一个用于设置对main
的调用,另一个用于通过submit
调用,它实际上设置了你需要做的工作。
如果您需要生成器的下一个值可用于pp运行,也可以将其作为参数传递!这避免了lambda函数和生成器引用,并让你传递一个简单的变量!
我的代码不再维护,但如果你好奇,请查看: http://pps-spud.uchicago.edu/viewvc/fps/trunk/python/fps.py?view=markup
答案 1 :(得分:0)
我认为你应该传递lambda:ks.next()而不是普通的旧ks