从返回的pool.apply_async

时间:2016-03-23 17:58:00

标签: python python-multiprocessing

我目前正在写一个隐写术程序。我目前拥有大部分我想要的东西。但是我想使用多个进程重建我的消息,这显然意味着需要对从进程返回的位进行排序。所以目前我有:

好的我现在回家我会提供一些实际的代码。

def message_unhide(data):
    inp = cv.LoadImage(data[0]) #data[0] path to image
    steg = LSBSteg(inp)
    bin = steg.unhideBin()
    return bin

#code in main program underneath
count = 0
f = open(files[2], "wb") #files[2] = name of file to rebuild
fat = open("fat.txt", 'w+')
inp = cv.LoadImage(files[0][count]) # files[0] directory path of images
steg = LSBSteg(inp)
bin = steg.unhideBin()
fat.write(bin)
fat.close()
fat = open("fat.txt", 'rb')
num_files = fat.read() #amount of images message hidden across
fat.close()
count += 1
pool = Pool(5)
binary = []
''' Just something I was testing
for x in range(int(num_files)):
        binary.append(0)
    print (binary)
'''
while count <= int(num_files):
        data = [files[0][count], count]
        #f.write(pool.apply(message_unhide, args=(data, )))                #
        #binary[count - 1] = [pool.apply_async(message_unhide, (data, ))]  #
        #again just another few ways i was trying to overcome
        binary = [pool.apply_async(message_unhide, (data, ))]
        count += 1
pool.close()
pool.join()
bits = [b.get() for b in binary]
print(binary)

#for b in bits:
    #    f.write(b)
f.close()

此方法只会覆盖二进制文件

binary = [pool.apply_async(message_unhide, (data, ))]

此方法填充整个二进制文件,但是我松开了.get()

binary[count - 1] = [pool.apply_async(message_unhide, (data, ))] 

对于草率编码我很抱歉,我当然不是专家。

1 个答案:

答案 0 :(得分:0)

您的主要问题与在循环中覆盖binary有关。您在列表中只有一个项目,因为您丢弃了以前的列表并每次都重新创建它。相反,您应该使用append来修改现有列表:

binary.append(pool.apply_async(message_unhide, (data, )))

但如果您使用pool.map而不是滚动自己的版本,那么您可能会有更好的时间。它期望一个迭代产生一个参数,在每次迭代时传递给函数,并返回一个返回值列表。 map调用阻塞,直到所有值都准备好,因此您不需要任何其他同步逻辑。

这是一个使用生成器表达式动态构建data参数项的实现。你可以简化一些事情,只需将files[0]传递给map,如果你重写message_unhide直接接受文件名作为参数,而不索引列表(你似乎从不使用索引):

# no loop this time
binary = pool.map(message_unhide, ([file, i] for i, file in enumerate(files[0])))