首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行Python:如何向“提交”提供参数?

并行Python:如何向“提交”提供参数?
EN

Stack Overflow用户
提问于 2009-10-09 22:49:43
回答 2查看 3.6K关注 0票数 6

这只是parallel-python标签的第二个问题。在浏览了文档并用谷歌搜索了这个主题之后,我来到了这里,因为它是我获得答案和建议的最好机会。

下面是将所有相关信息提交给pp的API (我想它是被调用的)。

代码语言:javascript
复制
    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()
    """

下面是我的submit语句及其参数:

代码语言:javascript
复制
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“之类的错误(例如)。

现在,为了能够使用.next()key_seq是一个生成器,所以我必须使用它的一个实例

代码语言:javascript
复制
def key_seq():
    a = 0
    while True:
        yield a
        a = a + 1
ks = key_seq()

globals()中定义了ks。当我没有在其他地方包含它时,我得到了一个错误,显示为'ks is not defined‘。当我在depfuncs中包含ks时,会出现以下错误:

代码语言:javascript
复制
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的事情呢?我不知道该怎么做。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-10 10:23:51

有趣的是,你在做遗传学模拟吗?我问这个问题是因为我在那里看到了‘染色体’,而且我曾经用并行蟒蛇开发了一个群体遗传学模拟。

你的方法看起来很复杂。在我的并行python程序中,我使用了以下调用:

代码语言:javascript
复制
job = jobServer.submit( doRun, (param,))

我是怎么逃脱惩罚的?诀窍在于doRun函数并不是在与调用sumbit的上下文相同的上下文中运行。例如(人为设计的示例):

代码语言:javascript
复制
import os, pp

def doRun(param):
    print "your name is %s!" % os.getlogin()

jobServer = pp.Server()
jobServer.submit( doRun, (param,))

此代码将失败。这是因为doRun中不存在os模块-- doRun不是在与submit相同的上下文中运行。当然,您可以在submitmodule参数中传递os,但是在doRun中直接调用import os不是更简单吗?

并行python试图通过在一个完全独立的进程中运行您的函数来避免python的GIL。它试图通过让你引用“传递”参数和名称空间给你的函数来让它更容易被接受,但是它使用hacks来实现。例如,您的类将使用pickle的某个变体进行序列化,然后在新流程中取消序列化。

但是,与其依赖submit的黑客攻击,不如接受这样一个现实:你的函数需要完成设置其运行上下文的所有工作。你实际上有两个main函数--一个是设置对submit的调用,另一个是通过submit调用的,它实际上设置了你需要做的工作。

如果您需要生成器中的下一个值可用于pp运行,也可以将其作为参数传递!这就避免了lambda函数和生成器引用,只需要传递一个简单的变量!

我的代码不再需要维护,但如果您感兴趣,请查看此处:http://pps-spud.uchicago.edu/viewvc/fps/trunk/python/fps.py?view=markup

票数 5
EN

Stack Overflow用户

发布于 2009-10-09 23:56:23

我认为应该传入lambda:ks.next()而不是普通的ks

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1546429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档