现在的做法是各位大佬认为鄙夷的方式,
抱歉,我还在用 request-html,因为是一些原因,我现在只能(会 or 选择)用这个。。。 :-(
while xxx:
try:
pageStr = someFunc.GetReauestRenderHtmlSourcetoStr(linkURL)
if len(pageStr) > 150:
success = True
#xxx 省略
pass
else:
#是的,就是这样粗暴地抛出,而没有在 request-html 本身上去做对策
raise Exception()
except:
# 记录下异常的时间节点
todoSomething(xxx)
这有个不好,request-html 使用的是 pyppeteer+chrome,在 raise Exception()抛出后,chrome.exe 还会在进程里残留的,不会自己退出,以前单线程还好,在循环的开始加个 os.system("taskkill -f -im chrome.exe")就完事了,现在多进程就不能这么做了。。。请教各位大佬有什么好办法?学习学习...
其实请教问题的实质,并不只是,想要把 request-html 如何回收得干净,如果 try 段里面,有更杂乱的调用话,try 本身是否有其它方法而不用根据 Exception 的内容,直接清干净? 还是只能老老实实,逐个应对?
1
Trim21 2019-10-26 12:41:15 +08:00 via iPhone
你说的是 try toexcept finally 的 finally 么
|
2
qazwsxkevin OP @Trim21 嗯嗯,是的,是 finnally 里,其实我原本的代码里,finally 是没有的...
|
3
momocraft 2019-10-26 12:52:48 +08:00 1
資源管理 (保證釋放) 的常見寫法是釋放在 finally, 或者做成 with-resource
|
4
ClericPy 2019-10-26 13:50:00 +08:00 2
说的都真麻烦, 以前我也写过操作 Chrome 的库, 用的方式无外乎三个
1. 用 with 包起来, exit 的时候清理进程 2. 使用 weakref, 弱引用可以用 set 也可以用 dict, 自己选择, 维护一个 instance pool, 然后每隔一段时间扫一下不存在的, 做清理. 3. 注册到 atexit 里面去 你这是 Windows 上操作啊... 杀进程跨平台最好用还是 psutil, 不过看你只会用 Requests-html... 就不聊 cdp 方面的东西了 |
5
ClericPy 2019-10-26 13:52:17 +08:00
不过最简单的除了 atexit 和 with 外, 还是把任务写成 class, 在 __del__ 里面做处理, 这样每次回收内存就会杀死对应进程, 与你标题的要求比较贴近
|
6
wysnylc 2019-10-26 15:20:16 +08:00
题外话一下,java 没有这个烦恼
|
7
qazwsxkevin OP |
8
ClericPy 2019-10-26 16:23:29 +08:00
@qazwsxkevin with 上下文用法其实就是对一个包含 __enter__ 和 __exit__ 魔术方法的对象的一种语法糖, 也就是不管是否报错, 都会在代码块结束时候执行 exit 那部分. 找个靠谱点的教程吧, 或者单独搜搜 python with 的用法
cdp 全称好像是 chrome devtools protocol, 是一套与 chrome debug remote 启动模式的交流协议, 包含 http 和 WebSocket 两部分, 而 chrome devtools 说白了, 可以简单理解成 chrome 浏览器按 F12 后底部出现的那个 devtools, 也就是和它交互用到的协议 稍微理解的话, 可以点我头像的 github 里面有个 ichrome 项目, 通过 pip 可以安装上, 如果对协程不了解, 可以先用同步的那个版本, 看 example 的代码就知道了, open link 好像用的是 set_url 函数, 点击用的是 click 函数, 不过只支持 css 选择器 鉴于 cdp 的 DOM 操作很多坑 (那个 pyppeteer 作者也这么说的), 所以还是使用注入 js 的方式来操作浏览器比较省事. 同步和异步的 ichrome 调用方式里, chrome daemon 那个类使用 with 的方式是可以自动关闭进程的, 多个实例就是多个端口(需要区分端口)的进程 说多了也没用, 直接体验吧, 前两天刚开了博客, 还没开始写操作 chrome 的博文, 估计得等一两周才会写... |