【问题标题】:Program hang with asyncio程序因 asyncio 挂起
【发布时间】:2017-01-20 22:48:13
【问题描述】:

这是我的代码:

import asyncio, socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 1234))
sock.setblocking(False)

queue = asyncio.Queue()

def sock_reader():
    print(sock.recv(1024))
    # x = yield from queue

def test_sock_reader():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.sendto(b'HELLO', ('127.0.0.1', 1234))

loop = asyncio.get_event_loop()
loop.add_reader(sock, sock_reader)
loop.call_later(0.5, test_sock_reader)
loop.run_forever()
loop.close()

这是输出:

b'HELLO'

# x = yield from queue 行未注释时,程序不再打印b'Hello'

为什么yield from 会影响应该已经执行的命令?

【问题讨论】:

    标签: python python-3.5 python-asyncio


    【解决方案1】:

    问题在于语法和 API 定义的结合。

    首先,参考documentation of add_reader,它声明它需要一个回调。从这个词本身看不出来,但是说callback就是一个普通函数的意思。

    现在,当您取消注释 # x = yield from queue 行时,由于 yield from,您的 sock_reader 函数实际上变成了生成器/协程,在这种情况下,当像常规函数(即 sock_reader(...))一样调用时,它返回一个生成器对象,并且不会被执行。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多