gpt4 book ai didi

python - 与多处理一起使用时,Matplotlib 图没有响应

转载 作者:太空狗 更新时间:2023-10-30 02:20:17 24 4
gpt4 key购买 nike

我正在尝试创建一个非常基本的应用程序,它将从流数据源更新 matplotlib 中的图表。在单独的进程中接收数据。但即使是最基本的显示,我的 matplotlib 图形也一直让我着迷。 matplotlib 窗口失去交互性并变成“图 1(无响应)”。我是否需要显式地给 matplotlib 一些 CPU 时间,以使其与 multiprocessing 很好地协同工作?

这是一个基本示例,它在 Windows 7、64 位、Python 2.7.3 32 位的几乎所有后端上都会失效。我正在使用来自 here 的 scipy-stack 的非官方二进制文件:

编辑:它似乎也不适用于 Ubuntu(32 位)。

import time

from multiprocessing import Process

import matplotlib.pyplot as plt

def p1_func():
while True:
time.sleep(1)


def p2_func():
plt.ion()
plt.plot([1.6, 2.7])
while True:
time.sleep(1)

if __name__ == '__main__':

p1_proc = Process(target=p1_func)
p2_proc = Process(target=p2_func)

p1_proc.start()
p2_proc.start()

p1_proc.join()
p2_proc.join()

我做错了什么?

您通常如何使实时数据和线程(多处理或其他)的 matplotlib 交互式图形共存?

最佳答案

下面是一个简单的例子

import time
from multiprocessing import Process, Pipe

import numpy as np
import matplotlib.pyplot as plt

class DataStreamProcess(Process):
def __init__(self, connec, *args, **kwargs):
self.connec = connec
Process.__init__(self, *args, **kwargs)

def run(self):
random_gen = np.random.mtrand.RandomState(seed=127260)
for _ in range(30):
time.sleep(0.01)
new_pt = random_gen.uniform(-1., 1., size=2)
self.connec.send(new_pt)


def main():
conn1, conn2 = Pipe()
data_stream = DataStreamProcess(conn1)
data_stream.start()

plt.gca().set_xlim([-1, 1.])
plt.gca().set_ylim([-1, 1.])
plt.gca().set_title("Running...")
plt.ion()

pt = None
while True:
if not(conn2.poll(0.1)):
if not(data_stream.is_alive()):
break
else:
continue
new_pt = conn2.recv()
if pt is not None:
plt.plot([pt[0], new_pt[0]], [pt[1], new_pt[1]], "bs:")
plt.pause(0.001)
pt = new_pt

plt.gca().set_title("Terminated.")
plt.draw()
plt.show(block=True)

if __name__ == '__main__':
main()

关于python - 与多处理一起使用时,Matplotlib 图没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24151560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com