传输大数据时,CEFPython窗口关闭而没有警告

时间:2019-03-12 14:49:44

标签: javascript python chromium-embedded cefpython

我试图创建与我创建的electronicjs应用程序的python绑定,其中python部分用于分析数据,并将结果(python字典)传递到Web浏览器以可视化。一切都像处理少量数据的魅力一样,但是当我尝试传递大型结果字典(〜200MB)时,创建了窗口,但是在没有警告的情况下关闭了终端(我无法检查devtool),尽管那里似乎是一直在后端运行的子进程。 Windows和Ubuntu计算机上均出现了此问题,非常感谢您的帮助。

这是我的代码:

def view(data):

config = data

settings = {
    "debug": True,
    "log_severity": cef.LOGSEVERITY_INFO,
    "log_file": "debug.log",
}
cef.Initialize(settings=settings)
browser_setting = { "file_access_from_file_urls_allowed":True,\
                "universal_access_from_file_urls_allowed": True,\
                "web_security_disabled":True}
browser = cef.CreateBrowserSync(url='file://' + os.path.realpath("index_cefpython.html"),
                                window_title="Javascript Bindings", settings = browser_setting)
browser.SetClientHandler(LoadHandler(config))
bindings = cef.JavascriptBindings()
browser.SetJavascriptBindings(bindings)
cef.MessageLoop()
del browser
cef.Shutdown()

return 


class LoadHandler(object):

def __init__(self, config):
    self.config = config
def OnLoadEnd(self, browser, **_):
    browser.ExecuteFunction("defineData", self.config)

在JS方面,我有:

<script type="text/javascript">
    function defineData(datainput){             

    console.log("start")
    data = datainput;

    Main();
    }
</script>

这是终端中打印出的所有消息:

  

[0312 / 104311.439:INFO:cefpython_app.cpp(199)] [浏览器进程] OnBeforeChildProcessLaunch()命令行:“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ subprocess” --type = gpu-process --no-sandbox --locales-dir-path =“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales” --log-file = debug.log --log-severity = info --resources-dir -path =“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3” --lang = zh-CN --disable-gpu-shader-disk-cache / prefetch:2

     

[0312 / 104311.440:INFO:cef_log.cpp(8)] [浏览器进程]开关已设置,忽略:disable-gpu-shader-disk-cache

     

[0312 / 104311.440:INFO:cefpython_app.cpp(199)] [浏览器进程] OnBeforeChildProcessLaunch()命令行:“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ subprocess” --type = gpu-process --no-sandbox --locales-dir-path =“ C:\ Users \ Xiangyun \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales” --log-file = debug.log --log-severity = info- -resources-DIR-PATH =” <> \ Anaconda3 \ LIB \站点包\ cefpython3" --lang = EN-US - 禁用GPU着色器,磁盘缓存--gpu - 偏好= KAAAAAAAAACAA4CAAQAAAAAAAAAAAGAAEAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAIAAAAAAAAAAoAAAAAAAAADAAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAKAAAAEAAAAAAAAAAAAAAACwAAABAAAAAAAAAAAQAAAAoAAAAQAAAAAAAAAAEAAAALAAAA --locales- dir-path =“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales” --log-file = debug.log --log-severity = info --resources-dir-path =“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3“ --lang = zh-CN / prefetch:2

     

[0312 / 104311.473:INFO:cef_log.cpp(8)] [浏览器进程]调用了CreateBrowserSync()

     

在ws://127.0.0.1:59232 / devtools / browser / abaff316-3b5c-4647-8af3-c7c521146d08上侦听的DevTools   [0312 / 104311.473:INFO:cef_log.cpp(8)] [浏览器进程] navigationUrl:file:////// <> /index_cefpython.html

     

[0312 / 104311.475:INFO:cef_log.cpp(8)] [浏览器进程] CefBrowser :: CreateBrowserSync()

     

[0312 / 104311.493:INFO:cef_log.cpp(8)] [浏览器进程] GetPyBrowser():创建新的PyBrowser,browserId = 1

     

[0312 / 104311.516:INFO:cefpython_app.cpp(199)] [浏览器进程] OnBeforeChildProcessLaunch()命令行:“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ subprocess” --type = renderer- no-sandbox --service-pipe-token = C31AF08C64F1883299C21D068EF5263C --lang = zh-CN --locales-dir-path = <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales“ --log-file = debug。日志--log-severity = info --resources-dir-path =“ <> \ Anaconda3 \ lib \ site-packages \ cefpython3” --disable-gpu-shader-disk-cache / prefetch:1

     

[0312 / 104311.528:INFO:cef_log.cpp(8)] [浏览器进程] GetPyFrame():基础框架尚不存在:browserId = 1,frameId = -4

     

[0312 / 104311.529:INFO:cef_log.cpp(8)] [浏览器进程] GetPyFrame():基础框架尚不存在:browserId = 1,frameId = -4

     

[0312 / 104311.531:INFO:cef_log.cpp(8)] [浏览器进程] CefBrowser :: CreateBrowserSync()成功

     

[0312 / 104311.532:INFO:cef_log.cpp(8)] [浏览器进程] CefBrowser窗口句柄= 595526

     

[0312 / 104311.533:INFO:cef_log.cpp(8)] [浏览器进程] GetPyFrame():底层框架尚不存在:browserId = 1,frameId = -4

     

[0312 / 104311.534:INFO:cef_log.cpp(8)] [浏览器进程] SendProcessMessage():message = DoJavascriptBindings,参数大小= 1

     

[0312 / 104311.534:INFO:cef_log.cpp(8)] [浏览器进程] MessageLoop()

     

[0312 / 104311.612:INFO:client_handler.cpp(40)] [浏览器进程] OnProcessMessageReceived():OnContextCreated

     

[0312 / 104311.613:INFO:cef_log.cpp(8)] [浏览器进程] V8ContextHandler_OnContextCreated()

     

[0312 / 104311.614:INFO:cef_log.cpp(8)] [浏览器进程] GetPyFrame():创建新的PyFrame,frameId = 2

1 个答案:

答案 0 :(得分:0)

不应将Javascript bindinsgs用于传输大数据。要发送大数据,请使用http请求。基本上,要么使用AJAX请求并运行内部应用程序内Web服务器,要么使用允许处理请求而无需运行Web服务器的资源处理程序。

请参见教程文档>“ JavaScript集成”>“使用http请求进行通信”部分(单击链接后向下滚动):

https://github.com/cztomczak/cefpython/blob/master/docs/Tutorial.md#javascript-integration

您可以尝试使用javacript绑定以较小的部分发送数据,但使用请求的性能会更好。

检查发送数据时应用内存的高峰。在Linux上使用进程监视器,在Windows上使用进程管理器。

要找出发送200 MB数据时失败的原因,请调试应用以获取堆栈跟踪。如果使用Linux,请从Releases页面下载带有调试符号的libcef.so,例如v66-上游。用该文件替换cefpython3软件包中的原始libcef.so。 GDB命令可以在这里找到:

https://github.com/cztomczak/cefpython/blob/master/docs/Knowledge-Base.md#python-crashes-with-segmentation-fault---how-to-debug