程序挂起与异步

Program hang with asyncio

这是我的代码:

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'

When the line # x = yield from queue is uncommented the program is not printing b'Hello' anymore.

为什么 yield from 影响了一个本应 执行 的命令?

问题是语法和 API 定义的组合。

首先,请参阅 documentation of add_reader,其中指出它需要 回调。从这个词本身看并不明显,但是通过说 callback 它意味着一个常规函数。

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