首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从StreamReader访问uvloop版本的asyncio.Server?

如何从StreamReader访问uvloop版本的asyncio.Server?
EN

Stack Overflow用户
提问于 2021-02-05 05:11:14
回答 1查看 71关注 0票数 0

Python 3.6和3.8。

我使用以下几行代码来启动服务器:

代码语言:javascript
复制
class MyServer:

    async def main(self, handler, host, port):
        self._server = await asyncio.start_server(handler, host=host, port=port)

        # Next line does not work with uvloop
        self._server._stop = False

其中_stop属性将被添加到处理程序中的access。

然后在处理程序中,我会像这样设置_stop属性:

代码语言:javascript
复制
async def handler(reader, writer):
    writer._transport._server._stop = True

在不使用uvloop的情况下,这种方法效果很好。但是当使用uvloop时,这不再起作用。

当我尝试设置(!)服务器对象上的_stop属性立即出现以下错误:

代码语言:javascript
复制
AttributeError: 'uvloop.loop.Server' object has no attribute '_stop'

我的问题是如何在处理程序和服务器之间“通信”?

PS。当不使用uvloop时,这一切都有效,因为StreamWriter._transport有一个属性_server。

EN

回答 1

Stack Overflow用户

发布于 2021-02-05 22:24:27

感谢@user4815162342,我可以很容易地通过简单地将成员函数作为回调传递来进行管理。

这不是我的第一个猜测,因为成员函数接受三个参数,而回调函数接受两个参数(在web上搜索"python bound method“,了解更多关于这一点的信息,以及为什么下面的代码仍然可以正常工作)。

但是下面的代码演示了它是如何工作的:

代码语言:javascript
复制
import asyncio


class MyServerContext:

    async def handler(self, reader, writer):
        line = await reader.readline()
        if line == b'stop\n':
            setattr(self, '_stop', True)

    async def send_stop(self):

        _, writer = await asyncio.open_connection('localhost', 6369)
        writer.write(b'stop\n')
        await writer.drain()
        writer.close()
        await writer.wait_closed()

    async def start(self):

        server = await asyncio.start_server(
            self.handler,    # <---- Member function as call back
            'localhost',
            6369)

        while not getattr(self, '_stop', False):
            await self.send_stop()

        server.close()
        await server.wait_closed()


if __name__ == '__main__':
    server_context = MyServerContext()
    asyncio.get_event_loop().run_until_complete(server_context.start())
    exit(0)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66053846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档