gpt4 book ai didi

python - 为稍后的循环迭代安排协程

转载 作者:行者123 更新时间:2023-12-01 04:54:41 24 4
gpt4 key购买 nike

我借用了这个简单聊天的代码:

import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.gen

clients = []

class IndexHandler(tornado.web.RequestHandler):

@tornado.web.asynchronous
def get(request):
request.render("index.html")


class WebSocketChatHandler(tornado.websocket.WebSocketHandler):

def open(self, *args):
print("open", "WebSocketChatHandler")
clients.append(self)

def check_origin(self, origin):
return True

@tornado.gen.coroutine
def on_message(self, message):

for client in clients:
client.write_message(message)

@tornado.gen.coroutine
def myroutine(m):
print "mensaje: "
c = (yield 123123123)
print ("mensaje", m, c)
yield myroutine(message)

def on_close(self):
clients.remove(self)

app = tornado.web.Application([(r'/chat', WebSocketChatHandler), (r'/', IndexHandler)])

app.listen(8888)
tornado.ioloop.IOLoop.instance().start()

聊天应用程序运行良好(即我使用 websocket 客户端看到回声),并且我对其进行了一些修改以测试一些自定义代码。

并且,仅出于测试目的,我想插入一个可能很重的函数调用,我想使其异步。

这里的实际意图是,myroutine 将启动游戏引擎作为并行任务。

也许我遗漏了一些东西,但我的代码的目的是分两部分重新安排协程。这意味着:协程应该打印“message”,然后生成值 123123123(实际上,这是一个立即值,将被包装到已经解决的 future 中 - 该值将在结果中),从而将自身重新安排到下一个迭代,并(在后面的迭代中)打印给定的元组 ("message", message, c)

我的问题是该函数永远不会重新安排(即控制台仅打印“message:”)。

我做错了什么?这是我第一次尝试 Tornado(以及一般的异步编程)。我如何告诉 Tornado 循环“伙计,这个值是我的协程,这些是我的协程的参数。请通过在下一个循环中调度它来并行启动它”?

最佳答案

有两个问题:首先,你不能从协程中产生所有类型的对象,你必须产生 Future或其他特殊的可产生对象。因此,当你的协程产量 123123 时,Tornado 会抛出“不良产量”异常。不幸的是,如果“on_message”是一个协程,Tornado 的 websocket 代码并不能捕获来自“on_message”的异常,因此异常会默默地传递。请参阅the warning at the bottom of the coroutine documentation .

您的解决方案是从“mycoroutine”生成一个有效的对象。如果你只是想屈服一下,yield "gen.moment" :

print "one"
yield gen.moment
print "two"

如果你希望“mycoroutine”并行运行而不阻塞“on_message”,只需调用它而不产生yield:

mycoroutine(message)

但是!以这种方式调用协程意味着没有人会监听它是否抛出异常。确保捕获并记录“mycoroutine”中的所有异常,否则它们会默默地通过。

关于python - 为稍后的循环迭代安排协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com