gpt4 book ai didi

multithreading - matplotlib show挂线程

转载 作者:行者123 更新时间:2023-12-03 13:19:27 26 4
gpt4 key购买 nike

我有两个通过套接字进行通信的进程。
第一个过程首先以下列方式打开第二个过程:

def run_command(cmd)
subprocess.call(cmd, shell=True)

cmd = 'python full_path_to_script.py'
thread = Thread(target=run_command, args=(cmd,)
thread.start()

然后打开连接:
from multiprocessing.connection import Client
address = ('localhost', port_number)
conn = Client(address, authkey=b'some_password')

当第一个想要绘制某些内容时,它会向第二个发送一条消息,后者会解密该消息并使用matplotlib绘制数据。这个想法是,第一个消息打开一个图像,其他消息将更新发送到该图像。
问题是pyplot.show挂起了第二个进程,该进程现在无法获取新消息。我尝试使用pyplot.ion(),但是随后该图被冻结(添加pyplot.pause(0.001)并没有帮助)。

最佳答案

很难在不看代码的情况下准确地知道您在做什么,但是我认为这是预期的正确行为。

如果您在不使用交互模式的情况下使用plt.show,则发生的情况是GUI事件循环正在控制您的子进程中的线程。该事件循环是鼠标/键盘事件使图形具有交互性的原因。因此,只要打开该窗口,GUI就会控制第二个进程的主线程,并且它似乎会忽略您的其他消息。

或者,当您使用plt.ion()时,GUI事件循环不会运行,而是依赖于其他东西来周期性地踢它(在命令提示符下,这是通过PyOS_InputHook机制完成的),因此尽管您的第二个进程正在获取消息,但未显示任何内容(因为GUI事件循环尚未运行以重新绘制窗口),并且窗口似乎已死(因为事件循环未使用输入事件)。

您要么需要在第二个过程中滚动自己的事件循环(在实现RPC时,这不是一个坏主意),然后定期调用canvas.flush_events(它将运行事件循环,直到所有待处理的事件用尽),并让GUI框架处理引导过程中的事件(可能)将追随者过程中的消息处理推到子线程中(如果这样做,请务必谨慎,仅使用draw_idle请求重绘图形,GUI不喜欢您试图从不是主线程绘制)。

关于multithreading - matplotlib show挂线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120859/

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