У меня есть основной поток, запускающий Cmd
из cmd2
. Это позволяет мне интерактивно запускать новые потоки с помощью threading.Thread()
выполняющих симуляции в режиме реального времени. Каждый раз, когда результаты моделирования выводятся put()
в multiprocessing.Queue()
режиме. multiprocessing.Queue()
. Кроме того, я могу начать живые сюжеты, используя matplotlib.animate
. Я читал, что matplotlib
не является потокобезопасным, поэтому графики выполняются как multiprocessing.Process()
matplotlib
multiprocessing.Process()
и get()
результаты моделирования из очереди.
К сожалению, как только элементы из очереди собираются, они удаляются из очереди и недоступны для других потоков или процессов. Это означает, что я могу отправлять данные из потоков моделирования в процессы построения графиков, но не могу одновременно использовать результаты моделирования в своем основном потоке.
Решением может быть наличие двух очередей в каждом потоке моделирования: одна очередь для основного потока и одна очередь для процесса построения графика. Это, по-видимому, не оптимальное решение, а довольно сложное.
Кто-нибудь имеет представление о том, как реализовать какую-то нить-безопасную общую переменную, каждый поток и процессы могут читать и писать?
В общем, есть два основных способа совместного использования данных между потоками и памятью:
Python рекомендует вам избегать написания кода, который использует общую память, и если вам нужно обмениваться данными между потоками и процессами, вы должны просто сделать копию данных и отправить их через очередь.
Если вам нужна фактическая разделяемая память, это чревато многими опасностями, поскольку вам обязательно нужно иметь дело с замками, чтобы избежать проблем. Кроме того, это может быть невозможно во многих объектах python, так как все объекты python в процессе имеют GIL.
Я читал, что matplotlib не является потокобезопасным
Код, который не является многопользовательским, обычно не является многопроцессорным.
Кто-нибудь имеет представление о том, как реализовать какую-то нить-безопасную общую переменную, каждый поток и процессы могут читать и писать?
Вы не хотите, или если вам действительно нужно, используйте базу данных.
queue.Queue
для основного потока для чтения?