我在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_ctypes
的struct
,则可以使用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/