我有一个主线程从Cmd
运行cmd2
。这使我可以使用threading.Thread()
以交互方式启动新线程,以“实时”执行模拟。每步,仿真结果都在put()
中的multiprocessing.Queue()
中。另外,我可以使用matplotlib.animate
开始实时绘图。我读到matplotlib
并不是线程安全的,所以绘图以multiprocessing.Process()
和get()
的形式从队列中模拟结果。
不幸的是,一旦从队列中收集了项目,它们就会从队列中删除,不适用于其他线程或进程。这意味着我可以将数据从模拟线程发送到绘图过程,但不能在主线程中同时使用模拟结果。
一个解决方案可能是在每个模拟线程中有两个队列:一个队列到主线程,一个队列到绘图过程。这似乎不是最佳解决方案,而是一个相当复杂的解决方案。
有人知道如何实现每个线程和进程可以读取和写入的某种线程安全共享变量吗?
答案 0 :(得分:0)
通常,有两种在线程和内存之间共享数据的主要方法:
Python鼓励您避免编写使用共享内存的代码,并且如果需要在线程和进程之间共享数据,则应仅复制数据并通过队列发送。
如果您需要实际的共享内存,那么这将带来很多危险,因为您必须处理锁来避免问题。此外,对于许多python对象来说,这可能是不可能的,因为一个进程中的所有python对象都共享一个GIL。
我读到matplotlib不是线程安全的
不是多线程安全的代码通常也不是多进程安全的。
有人知道如何实现每个线程和进程可以读取和写入的某种线程安全共享变量吗?
您不想,或者如果真的需要,请使用数据库。