gpt4 book ai didi

python - 使用 matplotlib 运行线程会导致 python 崩溃

转载 作者:行者123 更新时间:2023-11-28 17:15:21 24 4
gpt4 key购买 nike

我有一个程序有 2 个非常简单的线程:

  • 串口监听一个
  • 一个用于文本 UI

我还有一个 matplotlib animation 在我的 main() 中运行。它有一个 scope 类,这是来自 matplotlib 的示例.

当程序开始运行时,它显示了情节,一切正常。问题是,只要用户输入一个键,程序就会崩溃,python 会以 fatal error 退出。

ui 线程与matplotlibscope 类无关。如果我删除创建图的代码,ui 线程没有问题,程序运行顺利。我还注意到我系统上的 matplotlib 使用 tkinter 来创建窗口。

对于为什么 matplotlib animation 会导致问题,您有任何提示或经验吗?线程不能与 matplotlib plot 一起使用吗?

我在 Windows7 的命令行窗口中使用 Python 2.7 运行它。

matplotlib 版本:2.0.2Tkinter 版本:8.5

错误:

Fatal Python error: GC object already tracked

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

或者这个错误:

TclStackFree: incorrect freePtr. Call out of sequence?

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

代码:

    import threading
import serial
from matplotlib.lines import Line2D
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class listner(threading.Thread):

def __init__(self,port):
threading.Thread.__init__(self)
self.sport=None
self.is_running=True
self.init_port(port)

def run(self):
print ' Reading from Port'
while self.is_running:
try:
self.sport.read(1)
except:
print 'Error reading port'

def init_port(self,port):
print '1'
if self.sport==None or not self.sport.is_open :
try:

self.sport = serial.Serial(port,115200)
self.sport.timeout = 1
self.sport.reset_input_buffer()
self.sport.reset_output_buffer()
self.port_open=True
except:
print " Port error Listener Initing\n",self.port_open,'\n',self.sport
else:
pass

def process(self):
pass


class ui(threading.Thread):

def __init__(self):
threading.Thread.__init__(self)
self.running = True

def run(self):

print 'Starting UI:\n'
while self.running:
print ' Enter input ''S'':\n'
user = raw_input()



def main(port):

listner_thread = None
try:
listner_thread = listner(port)
listner_thread.start();
except:
print "Listener Thread Failed To Start"
return

ui_thread=None
try:
ui_thread = ui()
ui_thread.start()
except:
print "UI Thread Failed To Start"
return

run_charts()



def run_charts():
fig, (ax1, ax2) = plt.subplots(2, 1)

scope1 = Scope(ax1)
ani1 = animation.FuncAnimation(fig, scope1.update, emit_ch1, interval=10,blit=True)

scope2 = Scope(ax2)
ani2 = animation.FuncAnimation(fig, scope2.update, emit_ch2, interval=10,blit=True)

plt.show()

def emit_ch1():
yield 0.001

def emit_ch2():
yield -0.001

class Scope(object):
def __init__(self, ax, maxt=2, dt=0.02):
self.ax = ax
self.dt = dt
self.maxt = maxt
self.tdata = [0]
self.ydata = [0]
self.line = Line2D(self.tdata, self.ydata)
self.ax.add_line(self.line)
self.ax.set_ylim(-.009, 0.009)
self.ax.set_xlim(0, self.maxt)

def update(self, y):
t = self.tdata[-1] + self.dt
self.tdata.append(t)
self.ydata.append(y)
self.line.set_data(self.tdata, self.ydata)
return self.line,



if __name__ == '__main__':
main('COM11')

最佳答案

第一个错误“致命 Python 错误:已跟踪 GC 对象”已于 2013 年关闭,状态为“CLOSED WONTFIX”参见 bug report在 Bugzilla 上

它似乎在 2015 年再次提出 [与 dask 相关] 时的临时修复是 use a single thread使用此代码:

   import dask
dask.set_options(get=dask.async.get_sync)

但问题实际上在于 dataframe.read_csv 问题。

问题是 eventually solved在更高版本的 Pandas 中。如果您升级您的 matplotlib 版本,该问题很可能也会通过类似的修复得到解决。

希望对你有帮助

关于python - 使用 matplotlib 运行线程会导致 python 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44555787/

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