程序挂起与异步
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 一个生成器对象,不会被执行。
这是我的代码:
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 printingb'Hello'
anymore.
为什么 yield from
影响了一个本应 执行 的命令?
问题是语法和 API 定义的组合。
首先,请参阅 documentation of add_reader
,其中指出它需要 回调。从这个词本身看并不明显,但是通过说 callback 它意味着一个常规函数。
现在,当您取消注释 # x = yield from queue
行时,由于 yield from
,您的 sock_reader
函数实际上变成了 generator/coroutine,在这种情况下,当像常规函数一样调用时(即 sock_reader(...)
),它 returns 一个生成器对象,不会被执行。