gpt4 book ai didi

python - 我的代码需要 gen.sleep 来执行异步函数吗?

转载 作者:行者123 更新时间:2023-12-01 02:46:21 25 4
gpt4 key购买 nike

我基于Python的Tornado编写了以下代码:

def process_data(data):
# To something

def handler(message):
if message['type'] == 'message':
data = message['data']
IOLoop.current().spawn_callback(process_data, data)

async def main():
redis_client = RedisClient(redis_conf)
pubsub = redis_client.subscribe("CHANNEL", handler)

async def fetch_messages():
while True:
pubsub.get_message()
await gen.sleep(0.0001)


await fetch_messages()

if __name__ == "__main__":
import logging
logging.basicConfig()

parse_command_line()

tornado.web.Application(debug=options.debug)

io_loop = ioloop.IOLoop.current()
io_loop.run_sync(main)

根据上面的代码,我可以看到 process_data 正在被调用。但是,如果我删除await gen.sleep(0.0001),则永远不会调用process_data。有谁知道为什么吗?

最佳答案

IOLoop.spawn_callback(callback, *args, **kwargs)

Calls the given callback on the next IOLoop iteration.

如果您不断调用一些同步代码(while True 而没有 await),您不会将控制权返回给事件循环,并且事件循环无法进行迭代执行回调。

await gen.sleep(0.0001) - 控件返回事件循环的位置,以便它可以执行某些操作(例如执行回调)。

对于像您这样的情况,Tornado 有一个特殊的对象可以将控制权返回到事件循环 - gen.moment :

    while True:
pubsub.get_message()
await gen.moment

我没有使用Tornado,但我敢打赌,更好的是使用一些设计用于异步程序的redis客户端,see this answer .

关于python - 我的代码需要 gen.sleep 来执行异步函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45224857/

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