[英]Using a Python websocket server as an async generator
我有一个需要使用 websocket 服务器的抓取工具(由于公司政策,go 不能详细说明原因),我正试图将其转换为模板/模块以便于在其他网站上使用。
我有一个主要的 function 运行服务器的循环(例如乒乓球以保持连接有效并在必要时发送工作和停止命令)我试图变成一个产生 HTML 抓取页面的生成器(异步, 当然)。 但是,我想不出将服务器变成生成器的方法。
这基本上是我想要的代码(当然,经过简化只是为了展示主要思想):
import asyncio, websockets
needsToStart = False # Setting this to true gets handled somewhere else in the script
async def run(ws):
global needsToStart
while True:
data = await ws.recv()
if data == "ping":
await ws.send("pong")
elif "<html" in data:
yield data # Yielding the page data
if needsToStart:
await ws.send("work") # Starts the next scraping session
needsToStart = False
generator = websockets.serve(run, 'localhost', 9999)
while True:
html = await anext(generator)
# Do whatever with html
这当然不起作用,给出错误“TypeError:'Serve'object is not callable”。 但是有什么办法可以按照这些思路设置一些东西吗? 我可以尝试的另一种方法是创建一个“间歇性” object 来保存结束循环等待的数据,但对我来说,这似乎比想出一种让这个想法发挥作用的方法更混乱。
提前致谢。
对于那些需要相同功能的人,我找到了一个基本上向后工作的解决方案:我没有生成数据,而是传递了处理所述数据的 function。 这是更新的示例案例:
import asyncio, websockets
from functools import partial
needsToStart = False # Setting this to true gets handled somewhere else in the script
def process(html):
pass
async def run(ws, htmlFunc):
global needsToStart
while True:
data = await ws.recv()
if data == "ping":
await ws.send("pong")
elif "<html" in data:
htmlFunc(data) # Processing the page data
if needsToStart:
await ws.send("work") # Starts the next scraping session
needsToStart = False
func = partial(run, htmlFunc=process)
websockets.serve(func, 'localhost', 9999)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.