python – 多进程还是多线程? – 并行化数百万次迭代的简单计算并将结果存储在单个数据结构中

前端之家收集整理的这篇文章主要介绍了python – 多进程还是多线程? – 并行化数百万次迭代的简单计算并将结果存储在单个数据结构中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有{string:list}条目的字典D,我计算了一个函数
f(D [s1],D [s2]) – >浮动
对于D中的一对字符串(s1,s2)

另外,
我创建了一个自定义矩阵类LabeledNumericMatrix,它允许我执行m [ID1,ID2] = 1.0等赋值.

我需要计算f(x,y)并将结果存储在m [x,y]中,用于字符串S集合中的所有2元组,包括s1 = s2时.
这很容易编码为循环,但是当集合S的大小增长到10,000或更大的大值时,执行此代码需要相当长的时间.

我存储在标记矩阵m中的结果都不相互依赖.
因此,使用python的多线程或多进程服务并行化这个计算似乎很简单.
但是,由于cPython不能真正允许我通过线程同时执行f(x,y)的计算和m [x,y]的存储,似乎多进程是我唯一的选择.
但是,我不认为多进程被设计为在进程之间传递大约1GB的数据结构,例如我的包含10000×10000元素的标记矩阵结构.

任何人都可以提供(a)如果我应该避免尝试并行化我的算法,以及(b)如果我可以进行并行化,如何做到这一点,最好是在cPython?

解决方法

第一个选项 – 服务器进程

创建服务器进程.它是Multiprocessing包的一部分,允许并行访问数据结构.这样,每个进程都将直接访问数据结构,锁定其他进程.

the documentation开始:

Server process

A manager object returned by Manager() controls a server process which
holds Python objects and allows other processes to manipulate them
using proxies.

A manager returned by Manager() will support types list,dict,
Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,
Queue,Value and Array.

第二种选择 – 工人池

创建Pool of workers,输入队列和结果队列.

>作为生产者的主要进程将使用对(s1,s2)为输入队列提供信息.
>每个工作进程将从输入队列中读取一对,并将结果写入输出队列.
>主线程将从结果Queue中读取结果,并将它们写入结果字典中.

第三种选择 – 分为独立问题

您的数据是独立的:f(D [si],D [sj])是一个隐蔽的问题,与任何f(D [sk],D [sl])无关.此外,每对的计算时间应该相当相等,或至少在相同的数量级.

将任务划分为n个输入集,其中n是您拥有的计算单元(核心,甚至计算机)的数量.将每个输入集分配给不同的进程,并加入输出.

猜你在找的Python相关文章