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

标签 python multithreading numpy multiprocess

我有一个包含 {string:list} 条目的字典 D,我计算了一个函数 f( D[s1],D[s2] ) --> float 对于 D 中的一对字符串 (s1,s2)。

此外, 我创建了一个自定义矩阵类 LabeledNumericMatrix,它允许我执行诸如 m[ ID1, ID2 ] = 1.0 之类的赋值。

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

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

任何人都可以提供以下建议:(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.

第二个选项 - worker 池

创建一个 Pool of workers ,一个输入队列和一个结果队列。

  • 作为生产者的主进程将向输入队列提供对 (s1, s2)。
  • 每个工作进程从输入队列中读取一对,并将结果写入输出队列。
  • 主线程会从result Queue中读取结果,并写入result dictionary。

第三种选择——划分为独立问题

你的数据是独立的:f( D[si],D[sj] ) 是一个隐蔽的问题,独立于任何 f( D[s< sub>k],D[sl] ) 。此外,每一对的计算时间应该相当相等,或者至少在相同的数量级。

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

关于python - 多进程还是多线程? - 并行化数百万次迭代的简单计算并将结果存储在单个数据结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359234/

相关文章:

python - 在Windows python 2.5中杀死一个进程

python - 需要将按行组织的日期重新格式化为日期列,其中日期行之间的数据被分配适当的日期

c - 通过线程进行多次访问导致数据丢失的搜索示例(C 语言)

java - 读取输出时如何处理 Java Processes 孙子进程?

python - numpy unique 总是一样的吗?

python - 如何在不保存到文件的情况下处理来自电报机器人的图像

java - 使用Timer在固定时间内重绘然后继续计算

python - 尝试使用 pygame 在 python 上播放声波

python-3.x - Docker python 无法导入通过 apt-get 安装的模块

python - SQLAlchemy:动态加载对另一个模块的反向引用