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

使用multiprocessing绘图时无法同时遍历绘制两条路径的问题咨询

问题原因分析
  • 进程创建方式错误:你写的Process(target=visualize_path(grid, start, goal, path1)).start()是直接调用了visualize_path函数,等函数执行完才会把返回值(此处为None)传给target参数,根本没有实现多进程效果,只是串行执行了两次绘图函数。
  • 跨进程绘图不可行:matplotlib的画布对象是进程内独立的,两个子进程会各自创建独立的画布,不可能把内容画到同一张图里,且matplotlib的GUI渲染逻辑本身不支持多进程操作。
  • 原绘图逻辑每次循环都会执行plt.cla()清空画布,就算你想办法做了进程间数据同步,每次清空操作也会把另一条路径的内容清掉。
解决方案

不需要使用多进程/多线程,直接在同一个动画循环里同步更新两条路径的当前点即可,修改后代码如下:

import matplotlib.pyplot as plt
import numpy as np

do_animation = True

def visualize_two_paths(grid_map, start, goal, path1, path2):
    oy, ox = start
    gy, gx = goal
    # 处理两条路径的坐标
    px1, py1 = np.transpose(np.flipud(np.fliplr(path1)))
    px2, py2 = np.transpose(np.flipud(np.fliplr(path2)))
    if not do_animation:
        plt.imshow(grid_map, cmap='Greys')
        plt.plot(ox, oy, "-xy")
        plt.plot(px1, py1, "-r", label="路径1")
        plt.plot(px2, py2, "-b", label="路径2")
        plt.plot(gx, gy, "-pg")
        plt.legend()
        plt.show()
    else:
        # 同步遍历两个路径的点,取长度最大值适配不同长度的路径
        max_len = max(len(px1), len(px2))
        for step in range(max_len):
            plt.cla()
            # 绑定esc退出事件
            plt.gcf().canvas.mpl_connect(
                'key_release_event',
                lambda event: [exit(0) if event.key == 'escape' else None])
            plt.imshow(grid_map, cmap='Greys')
            plt.plot(ox, oy, "-xb")
            # 绘制两条完整路径的轨迹
            plt.plot(px1, py1, "-r", label="路径1")
            plt.plot(px2, py2, "-b", label="路径2")
            plt.plot(gx, gy, "-pg")
            # 绘制当前步的位置,避免索引越界
            if step < len(px1):
                plt.plot(px1[step], py1[step], "or", markersize=10)
            if step < len(px2):
                plt.plot(px2[step], py2[step], "ob", markersize=10)
            plt.axis("equal")
            plt.grid(True)
            plt.legend()
            plt.pause(0.5)
        plt.show()

def main():
    start = [0,0]
    goal = [20,20]
    path1 = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]
    path2 = [[7, 15], [8, 16], [9, 17], [10, 18], [11, 19], [12, 20]]
    grid = np.zeros((20,20))
    visualize_two_paths(grid, start, goal, path1, path2)

if __name__ == "__main__":
    main()

修改说明:

  • 把单路径绘图函数改成支持双路径输入,同一个循环里同步更新两个路径的当前位置
  • 适配了不同长度的路径,避免索引越界
  • 增加了图例区分两条路径,用不同颜色标记轨迹和当前点
  • 剔除了没必要的多进程逻辑,完全避免了跨进程绘图的兼容性问题

内容的提问来源于stack exchange,提问作者Jahid Chowdhury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:51:03