如何正确使用async with tornad

2024-09-29 06:31:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在龙卷风的文献中提到通用协同程序装饰器来自旧版本。较新的应与aysnc一起使用。到目前为止,我还没能将这个小代码转换成tornado6.0.3。你知道吗

import tornado.web
import tornado.websocket
import tornado.httpserver

from random import randint
from tornado import gen
from tornado.ioloop import IOLoop

from web_handlers import HandlerIndexPage
from web_handlers import HandlerWebSocket

msg = 'none'

@gen.coroutine
def generate_random_int():
    global msg
    while True:
        msg = str(randint(0, 100))
        print('generated:', msg)
        yield gen.sleep(1.0)

@gen.coroutine
def generate_message_to_sockets():
    global msg
    while True:
        print ('new messageToCon: ', msg)
        yield [con.write_message(msg) for con in HandlerWebSocket.connections]
        yield gen.sleep(1.0)


class webApplication(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/', HandlerIndexPage),
            (r'/websocket', HandlerWebSocket)
        ]

        settings = {
            'template_path': 'templates'
        }
        tornado.web.Application.__init__(self, handlers, **settings)

if __name__ == '__main__':
    ws_app = webApplication()
    server = tornado.httpserver.HTTPServer(ws_app)
    port = 9090
    server.listen(port)
    print('websocket listening on port:'+ str(port))
    IOLoop.current().spawn_callback(generate_random_int)
    IOLoop.current().spawn_callback(generate_message_to_sockets)
    IOLoop.instance().start()

如何正确使用async?你知道吗


Tags: fromimportwebporthandlersdefmsgrandom
1条回答
网友
1楼 · 发布于 2024-09-29 06:31:53

在Tornado中,协程是可以插入Python2的生成器,而异步函数是Python3中的一级公民。它们有不同的语义(例如,您可以从异步函数return,但不能从协同程序)。您需要更改的代码如下所示:

...

import asyncio

...

async def generate_random_int():
    global msg
    while True:
        msg = str(randint(0, 100))
        print('generated:', msg)
        await gen.sleep(1.0)

async def generate_message_to_sockets():
    global msg
    while True:
        print ('new messageToCon: ', msg)
        futures = [con.write_message(msg) for con in HandlerWebSocket.connections]
        if futures:
            await asyncio.wait(futures)
        await gen.sleep(1.0)
...

您可以在这里看到与您的用例类似的示例:https://www.tornadoweb.org/en/stable/ioloop.html#ioloop-objects

相关问题 更多 >