0

クラス内でマルチプロセッシングをよりよく理解しようとしていますが、見つけることができる例では、apply_async ではなくマップを使用しています。以下でマップが機能していますが、apply_async には何も表示されません。どこが間違っていますか?

from multiprocessing import Pool

def unwrap_self_f(arg, **kwarg):
    return C.f(*arg,**kwarg)

def unwrap_self_finisher(arg, **kwarg):
    return C.finisher(*arg,**kwarg)

class C:
    def f(self, name):
        print 'hello %s' % name
        return name

    def finisher(self,result):
        print "done"


    def runMap(self):
        print "running Map..."
        pool = Pool(processes=2)
        names = ('frank', 'justin', 'osi', 'thomas')
        pool.map(unwrap_self_f, zip([self]*len(names), names))

    def runAsync(self):
        print "running Async..."
        pool = Pool(processes=2)
        names = ('frank', 'justin', 'osi', 'thomas')
        for name in names:
            pool.apply_async(unwrap_self_f,args=(name),callback=unwrap_self_finisher) 
        pool.close()
        pool.join()    

if __name__ == '__main__':
    c = C()
    c.runMap()
    c.runAsync()
4

1 に答える 1

0

あなたの問題は次のとおりだと思います:

def unwrap_self_f(arg, **kwarg):
    return C.f(*arg,**kwarg) #here you call a CLASS method of C

ただし、インスタンス メソッドとして定義します。

class C:
    def f(self, name): #self in here, so instance method
        print 'hello %s' % name
        return name

マルチプロセッシングの問題は、stderr で例外が発生しないことです。

于 2013-09-04T18:12:02.773 に答える