以下是我的代码片段
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这个包,本来想优化下程序的速度,参考了这篇文章的方法,但是出的错误不是很理解,求高手解答 , 谢谢
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 danbackground = 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:Program ini berfungsi, jadi masalahnya selesai, tetapi saya masih tidak memahami prinsipnya. Saya harap seseorang boleh memberi saya petunjuk