【发布时间】:2018-10-14 07:31:23
【问题描述】:
我有一个从cmd2 运行的主线程Cmd。这使我可以使用threading.Thread()“实时”执行模拟以交互方式启动新线程。每个时间步的模拟结果都是put() 中的multiprocessing.Queue()。此外,我可以使用matplotlib.animate 开始实时绘图。我读到matplotlib 不是线程安全的,所以这些图以multiprocessing.Process() 和get() 的模拟结果从队列运行。
不幸的是,一旦收集了队列中的项目,它们就会从队列中删除,并且不能用于其他线程或进程。这意味着我可以将数据从模拟线程发送到绘图进程,但不能在我的主线程中同时使用模拟结果。
一种解决方案可能是在每个模拟线程中有两个队列:一个队列到主线程,一个队列到绘图进程。这似乎不是最佳解决方案,而是一个相当复杂的解决方案。
有没有人知道如何实现某种线程安全的共享变量,每个线程和进程都可以读取和写入?
【问题讨论】:
-
很难理解线程和进程的含义。你启动一个或多个程序?您运行多处理或多线程或两者兼而有之?
-
添加一个
queue.Queue供主线程读取怎么样? -
@JohanL 我将
threading.Thread()和multiprocessing.Process()用于不同的任务(线程用于模拟,进程用于实时绘图)。 -
你有一个奇怪的设置,通常你想要做 CPU 绑定的东西,比如多进程中的模拟,而像绘图这样的 UI 东西通常必须在主线程中(大多数 UI 框架要求你只有一个 UI 线程)。
标签: python multithreading multiprocessing