繁体   English   中英

使用 Python websocket 服务器作为异步生成器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM