gpt4 book ai didi

python - python 中用于 multiprocessing.Array 的元组

转载 作者:行者123 更新时间:2023-12-01 05:04:55 32 4
gpt4 key购买 nike

我正在努力解决 python 中的多处理问题。我想将元组列表放入 multiprocessing.Array,但我找不到元组的类型代码。

这是代码,我想知道如何在 main 函数中为 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,可以将字符串元组映射到 char*struct,则可以使用 shared_ctypes

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

但我怀疑,如果您按照文档的建议进行操作,并找到一种根据消息传递而不是共享内存来编写代码的方法,您会发现生活变得更加简单。

由于您在这里需要的唯一共享突变是让每个作业在末尾弹出一个值,以便其他作业不会看到相同的值,所以明显的答案是使用 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com