我在python中进行多重处理。
我想将元组列表放在multiprocessing.Array中,但是找不到元组的类型代码。

这是代码,我想知道如何在主函数中为arr编写“ type_of_tuple”。

from multiprocessing import Pool, Array

def thread_func(time, array):
    time.sleep(time)
    if len(array) > 0:
        print(array.pop(0))

def main(cpu_number):
    list = [("a","b"), ("c","d"), ("e","f")]
    arr = Array( type_of_tuple """ how to write this?""", list)

    for i in range(cpu_number):
        r = pool.apply_async(thread_func, args=(1000, arr))
        thread_list.append(r)

    for thread in thread_list:
        thread.wait()

if __name__ == "__main__":
    main(3)

最佳答案

您找不到它的原因是因为它不存在。 Array的全部要点是,它处理简单,同质类型的数组,这些数组可以存储为“未装箱”的二进制数据。

元组是复合类型,可以容纳任意数量的任何类型的值。因此,您不能将其放在Array中。

实际上,您也不能将字符串放入数组中,因为字符串具有可变数量的字符。每个都是不同的大小。 (而且,如果这是Python 3,那就更糟糕了,因为字符可以是1、2或4个字节…)

最重要的是,数组的长度是固定的。您仍然无法pop对其进行估价。

因此,您将需要找到其他共享数据的方式。

如果您足够了解C,可以将字符串元组映射到shared_ctypesstruct,则可以使用char*

或者,您可以编写一个函数,在一侧将元组编码为固定大小的值(然后将其切成字符数组),在另一侧将其解码。

但是我怀疑,如果您按照文档的建议去做,并找到一种以消息传递而不是共享内存的方式编写代码的方法,您会发现生活简单得多。

由于您唯一需要共享的变异是使每个作业pop最终都具有一个值,以便其他作业不会看到相同的值,因此显而易见的答案是使用Queue,因为这正是它的含义做。

或者,甚至更简单,只需使用诸如map而不是apply之类的高级方法来管理队列并确保每个作业都获得一个值,因此您甚至不必思考关于它。例如:

def thread_func(time, value):
    time.sleep(time)
    print(value)

def main(cpu_number):
    values = [("a","b"), ("c","d"), ("e","f")]
    results = pool.imap_unordered(partial(thread_func, 1000), values[:cpu_number])
    for result in results:
        pass

if __name__ == "__main__":
    main(3)


(作为附带说明,我不确定为什么将任务数限制为CPU数。通常,您创建一个Pool(cpu_number)并将所有任务排在队列中。如果您只想恰好执行3个任务,您甚至根本不需要一个池,只需在Process上运行每个池即可。)

关于python - 用于Python中multiprocessing.Array的元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25229790/

10-13 08:35
查看更多