python - 在 Python 多线程中调用 requests_html 或 pyppeteer ErrorError: signal only works in main thread
问题描述
我大概了解到错误是由于在pyppeteer和requests_html中使用了协程io,这与多线程冲突,但我找不到解决这个问题的方法。我不太会说英语,我使用谷歌翻译。
import asyncio
from pyppeteer import launch
from requests_html import HTMLSession
# Simulation using requests_html
def test1():
session = HTMLSession()
_r = session.get('http://bbs.tianya.cn/post-free-6085404-1.shtml' )
_r.html.render()
html = _r.html.html
print(html)
# main
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()
##The pyppeteer method is called at work
def aJob(arg):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main())
## Multi-threaded task generation
def multiThread():
from multiprocessing.dummy import Pool as ThreadPool
cpus = 1 # 线程池大小
pool = ThreadPool(cpus)
_lstParam = range(0, 3)
pool.map(aJob, _lstParam)
pool.close()
pool.join()
if __name__ == "__main__":
loop = asyncio.new_event_loop()
multiThread()
我想调用 pyppeteer 或 requests_html 来模拟在多线程中浏览网页,但我总是收到错误“ValueError:信号仅在主线程中有效”或“RuntimeError:线程'Thread-1'中没有当前事件循环。” 试了很多方法,都无法成功运行,请大家帮忙,谢谢!
解决方案
Pyppeteer 使用信号关闭浏览器进程,但信号仅在主线程中有效。如果您真的不需要此功能,只需在 pyppeteer.launch 方法上将 handleSIGINT、handleSIGTERM、handleSIGHUP 设置为 False
推荐阅读
- python - 如何使用 Q 对象应用条件 AND 语句
- scala - 在 Scala 中继续 for 循环
- r - 有没有一种聪明的方法可以将 R 宽数据收集到需要收集数百个不同变量的长数据?
- flutter - 如何使用按钮转到特定页面?扑
- python - Python列表理解/三元运算符:如果条件,则附加递增值,否则附加非递增值
- r - 更改属于同一组的行的值并且该组中至少有一个观察符合 dplyr 的条件
- vue.js - Vuex - 分配了mapState值的局部变量,改变局部变量也会改变存储变量?
- python - 每次迭代时保存 DataFrame
- python - 如何用另一个项目列表过滤元组列表
- python - 运行计数与另一行的休息条件