You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个进程协作处理同一个类实例,避免重复执行方法?

问题解答

首先明确: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:35:13