python - multiprocessing中用进程池apply_async出现的莫名错误
PHP中文网
PHP中文网 2017-04-18 10:03:05
0
1
668

以下是我的代码片段

import multiprocessing
@fn_timer
def getEnergyTerm(size , elements , elementSize , elementType , elementLine , elementGroup , imageElement , Dis , background):
    pdb.set_trace()
    functionList = [alignCalc , whiteSpace , getBalanceGravityCenter , spread , dist , margin , textSize , textVar , minTextSize , textContrast , textOverlap , graphicTextOverlap , graphicBoundary ,  groupSizeVar , groupDistMean]
    pool = multiprocessing.Pool()

    result = []
    #whiteSpace(size , elements , elementSize , elementType , elementLine , elementGroup , imageElement , background)
    #pool.apply_async(whiteSpace , args = (size , elements , elementSize , elementType , elementLine , elementGroup , imageElement , background))
    for func in functionList:
        result.append(pool.apply_async(func , args = (size , elements , elementSize , elementType , elementLine , elementGroup , imageElement , background)))

    pool.close()
    pool.join()
    print result
    energy = {k:v for item in result for k , v in item.get().items()}
    return energy

这里的functionList中的function类似于下面这样子的:

def whiteSpace(size , elements , elementSize , elementType , elementLine , elementGroup , imageElement , background):
    #pdb.set_trace()
    sum = size[0] * size[1]
    for item in range(len(elements)):
        sum -= elementSize[item][0] * elementSize[item][1]

    sum = sum * 1.0 / (size[0] * size[1])

    E_white_space =  -1.0 * sigmod(sum , alpha)
    res = {}
    res['whiteSpace'] = E_white_space
    return res

我使用pdb调试的时候,会在apply_async处出现错误,错误信息如下:

Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
    task = get()
  File "/usr/lib/python2.7/multiprocessing/queues.py", line 376, in get
    return recv()
TypeError: __new__() takes exactly 4 arguments (2 given)

实在想不到错在哪了,因为我不是很熟悉multiprocessing这个包,本来想优化下程序的速度,参考了这篇文章的方法,但是出的错误不是很理解,求高手解答 , 谢谢

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(1)
黄舟

Saya rasa saya telah menyelesaikan masalah ini, tetapi saya masih tidak tahu di mana masalah itu terletak pada asalnya terdapat parameter latar belakang dalam pool.apply_async(func , args = (size , elements , elementSize , elementType , elementLine , elementGroup , imageElement)), tetapi selepas memadamkan parameter ini, program berjalan dengan lancar dan background = Image.open('background.png') adalah. objek, pada asalnya saya fikir ia adalah kerana apply_async tidak boleh melepasi nilai jenis objek, tetapi selepas menguji dengan program berikut, sangkaan saya telah ditolak:

    import multiprocessing
    from PIL import Image

    def testFunc(y , x , calcY, list , str , img):
        a = [i*i for i in x]
        #b = [i+i for i in y]
        b = y[0]
        c = [i+i for i in list]
        res = {}
        res['a'] = a
        res['b'] = b
        res['c'] = c
        res['str'] = str
        img.paste(0 , (100 , 100 , 100 , 100))
        res['img'] = img

        return res



    if __name__ == '__main__':
        p = multiprocessing.Pool()
        img = Image.new('RGBA' , (800 , 600))
        res = p.apply_async(testFunc , args = ((2 , 3) , [2 , 3 , 4] , False , [6 , 7 , 8 , 9] , 'hello world' , img))
        print res.get()

Program ini berfungsi, jadi masalahnya selesai, tetapi saya masih tidak memahami prinsipnya. Saya harap seseorang boleh memberi saya petunjuk

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan