문제

이것은 병렬 파이썬 태그의 두 번째 질문 일뿐입니다. 문서를 살펴보고 주제에 대한 인터넷 검색을 한 후에, 나는 답과 제안으로 가장 행운을 빕니다.

다음은 모든 관련 정보를 PP에 제출하는 API (IT라고 생각합니다)입니다.

    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? 나는 어디로 가야하는지 이해하지 못한다. 감사.

도움이 되었습니까?

해결책

흥미로운 - 유전학 시뮬레이션을하고 있습니까? 나는 거기에 '염색체'가 보이기 때문에 묻고, 한 번 평행 파이썬을 사용하여 인구 유전학 시뮬레이션을 개발했습니다.

당신의 접근 방식은 정말로 복잡해 보입니다. 병렬 파이썬 프로그램에서 다음과 같은 전화를 사용했습니다.

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

이 코드는 실패합니다. OS 모듈은 Dorun에 존재하지 않기 때문입니다. Dorun은 제출과 동일한 컨텍스트에서 실행되지 않습니다. 물론, 당신은 통과 할 수 있습니다 os 에서 module 매개 변수 submit, 그러나 전화하는 것이 더 쉽지 않습니다 import os 도룬에서?

병렬 파이썬은 완전히 별도의 프로세스에서 기능을 실행하여 파이썬의 길을 피하려고합니다. 기능에 대한 "Pass"매개 변수 및 네임 스페이스를 인용하여 쉽게 삼킬 수있게하려고하지만 해킹을 사용하여 수행합니다. 예를 들어, 수업은 일부 변형을 사용하여 직렬화됩니다. pickle 그런 다음 새로운 프로세스에서 비생활 화.

그러나 의존하는 대신 submit해킹은 기능이 실행되는 컨텍스트를 설정하는 모든 작업을 수행해야한다는 현실을 받아들입니다. 당신은 정말로 두 가지가 있습니다 main 함수 - 전화를 설정하는 것 submit, 그리고 하나는 당신이 전화하는 것입니다 submit, 실제로 필요한 작업을 설정합니다.

PP 실행에 사용할 수 있도록 생성기의 다음 값이 필요한 경우 매개 변수로 전달하십시오! 이것은 람다 기능과 발전기 참조를 피하고 간단한 변수를 전달하게합니다!

내 코드는 더 이상 유지 관리되지 않지만 궁금한 점이 여기에서 확인하십시오.http://pps-spud.uchicago.edu/viewvc/fps/trunk/python/fps.py?view=markup

다른 팁

평범한 오래된 KS 대신 Lambda : Ks.next ()를 지나쳐야한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top