Python 使用asyncio挂起程序

Python 使用asyncio挂起程序,python,python-3.5,python-asyncio,Python,Python 3.5,Python 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_re

这是我的密码:

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'


为什么产生的
会影响本应执行的命令?

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

首先,请参阅,它表示需要回调。这个词本身并不明显,但callback的意思是一个正则函数


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

我希望
sock\u reader
等待队列中有一个项目。怎么做?@DombiSzabolcs看一下