Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从返回的池排序数据。应用\u异步_Python_Python Multiprocessing - Fatal编程技术网

Python 从返回的池排序数据。应用\u异步

Python 从返回的池排序数据。应用\u异步,python,python-multiprocessing,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

我目前正在写一个隐写术程序。我现在有我想工作的大部分事情。然而,我希望使用多个进程重建消息,这显然意味着需要对进程返回的位进行排序。因此,目前我有:


好的,我现在在家,我会把一些实际的代码

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()
这个方法填充整个二进制文件,但是我丢失了.get()


抱歉,我的编码太草率了,我当然不是专家。

您的主要问题是在循环中覆盖
二进制文件。列表中只有一项,因为每次都要丢弃上一个列表并重新创建它。相反,您应该使用
append
修改现有列表:

binary.append(pool.apply_async(message_unhide, (data, )))
但是如果您使用
pool.map
而不是滚动您自己的版本,您可能会玩得更开心。它期望一个iterable在每次迭代时向函数传递一个参数,并返回一个返回值列表。
map
调用会一直阻塞,直到所有值都准备好,因此不需要任何其他同步逻辑

下面是一个使用生成器表达式动态构建
数据
参数项的实现。如果您重新编写
message\u unhide
以直接接受文件名作为参数,而不为列表编制索引,则可以简化操作,只需将
文件[0]
传递到
映射


您的
while
循环是否可以更改为
for
在某个iterable上的循环(例如
范围
)?如果是这样的话,您可能可以使用
pool.map
为您自动处理事情。否则,您可能需要
binary.append(pool.apply\u async(extract\u bits,(data,)))
(注意
apply\u async
调用中添加的逗号)。实际上,我无法在每次使用pool.map时,无论以何种方式,都仔细思考它,我就是不能让它工作。如果我将
binary=[pool.apply\u async(message\u unhide,(data,)]
f.write=pool.apply(message\u unhide,(data,)
切换,则可以使此方法工作,但是此方法并没有加快任何速度。我按照您所说的那样做,只传递了映射文件的路径,这很好,但是没有明显的速度变化,因为据我所知,每个过程都需要先完成。但是,我可以实现一个循环,创建5个异步进程,每个进程都有自己的变量。等待这些操作完成,然后将变量写入文件。继续这样做,直到每个图像都完成。
binary[count - 1] = [pool.apply_async(message_unhide, (data, ))] 
binary.append(pool.apply_async(message_unhide, (data, )))
# no loop this time
binary = pool.map(message_unhide, ([file, i] for i, file in enumerate(files[0])))