如何让两个进程协作处理同一个类实例,避免重复执行方法?
问题解答
首先明确:Python多进程里没法让多个进程直接共享同一个类实例。因为每个进程都有独立的内存空间,不管是用fork还是spawn启动进程,子进程都会复制父进程内存(或重新初始化环境),你看到的两个实例是完全独立的个体,各自在自己的进程空间运行,所以才会执行两次完整计算。
要实现进程协作处理任务,核心思路是拆分计算任务,让每个进程只处理一部分数据,最后汇总各进程的结果。针对你的测试代码,我们可以把大循环拆分成两部分,让两个进程分别计算,再合并最终结果:
import time import multiprocessing class Test: def sum_part(self, start, end): total = 0 for i in range(start, end): for j in range(1, 10000): total += i + j return total def worker(start, end, queue): obj = Test() result = obj.sum_part(start, end) queue.put(result) if __name__ == '__main__': starttime = time.time() queue = multiprocessing.Queue() # 把原任务拆分为两个子任务 p1 = multiprocessing.Process(target=worker, args=(1, 5000, queue)) p2 = multiprocessing.Process(target=worker, args=(5000, 10000, queue)) p1.start() p2.start() p1.join() p2.join() # 汇总两个进程的计算结果 total = queue.get() + queue.get() print(f"The result is {total}") print('That took {} seconds'.format(time.time() - starttime))
针对进化树生成的实际场景
你提到的进化树计算任务,可以参考以下拆分思路:
- 如果是多序列比对后的距离矩阵计算:可以把序列对划分为多个子集,每个进程负责计算一部分序列对的距离值,最后合并成完整矩阵
- 如果是建树算法(如最大似然树):若为自定义实现,可拆分并行性高的步骤(比如不同分支的似然值计算)分配给不同进程;若用现有工具,优先使用工具自带的多进程参数(很多生信工具原生支持多线程/多进程)
注意:进程间数据传输有开销,要尽量减少跨进程传递的数据量。如果仅需共享少量状态,可使用multiprocessing.Value或Array,但复杂类实例无法直接共享,拆分任务仍是最高效的方案。
内容的提问来源于stack exchange,提问作者Nock
相关产品推荐
相关产品推荐

