Код: Выделить всё
Windows 11
python: 3.12.1
matplotlib: 3.10.3
backend: 'tkagg'
Tkinter version: 8.6
запустить отдельный процесс для отображения графиков Matplotlib и запустить дисплей, поместив
объект, который отображает графики на очередь - когда процесс графика получает такой объект из aever, он отображает таблицы. /># create cherrypy app and separate plot process
inputplotq = multiprocessing.Queue()
outputplotq = multiprocessing.Queue()
cpyapp = CPyApp(..., inputplotq, outputplotq)
plots_process = (
multiprocessing.Process(target=plot_process, args=(inputplotq,outputplotq), kwargs=keywords)
)
cherrypy.tree.mount(cpyapp)
cherrypy.engine.start()
# plotting process
def plot_process(inputplotq, outputplotq):
while not exit:
nextmsg = inputplotq.get()
if nextmsg is a plottingobj:
nextmsg.interactive_plot()
outputplotq.put("interactive windows clossed")
else
process command message
# cherry py app exposing method to generate plots
class CPyApp(..., inputplotq, outputplotq):
self.inputplotq = inputplotq
self.outputplotq = outputplotq
....
def genplots_interactive(**kwargs):
...
self.inputplotq.put(self.cachedplottingobj)
...
return self.cacheddoc
genplots_interactive.exposed = True
< /code>
Я изначально написал это на Linux с использованием: < /p>
python: 3.7.1
matplotlib: 3.4.0
backend: 'TkAgg'
Tkinter version: 8.6
< /code>
, который, кажется, работает нормально < /p>
, затем я выполнил работу в Windows, используя: < /p>
python: 3.12.1
matplotlib: 3.10.3
backend: 'tkagg'
Tkinter version: 8.6
< /code>
(я уверен, что разница связана с версией Python, но думал, что я упомянул, что это было в Windows в случае) < /p>
Когда я запускаю его, используя это вызов < /p>
self.inputplotq.put(self.cachedplottingobj)
< /code>
В методе приложения Cherry Py приводит к этому исключению: < /p>
Traceback (most recent call last):
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\site-packages\cherrypy\_cprequest.py", line 659, in respond
self._do_respond(path_info)
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\site-packages\cherrypy\_cprequest.py", line 718, in _do_respond
response.body = self.handler()
^^^^^^^^^^^^^^
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\site-packages\cherrypy\lib\encoding.py", line 223, in __call__
self.body = self.oldhandler(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\site-packages\cherrypy\_cpdispatch.py", line 54, in __call__
return self.callable(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lc922756\ttrpython\ttrresultparsers\localwebserver\ttrresapp.py", line 946, in genplots_interactive
self._plots_queue.put(genplt)
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\queues.py", line 94, in put
self._start_thread()
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\queues.py", line 187, in _start_thread
self._thread.start()
File "C:\Users\lc922756\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 992, in start
_start_new_thread(self._bootstrap, ())
RuntimeError: can't create new thread at interpreter shutdown
< /code>
Я понимаю из своих поисков, что это новая функция защиты, добавленную в Python 3.12,
, но я немного смущен тем, что именно здесь происходит, и задавался вопросом, может ли кто -то пролить немного света? /> Любые идеи о том, куда я должен смотреть или как я могу отладить это?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... n-in-inter