我很难理解asyncio的整个概念 . 现在,我尝试使用Socket模块和asyncio一起使UDP聊天作为服务器和客户端工作 . 在两个asyncio协同程序中,我运行循环(一个用于服务器,一个用于客户端) . 但该计划仅作为客户 . 在网络上发送数据但未接收数据 . 我想对于这种情况有更好的asyncio解决方案,但在继续之前我想了解为什么SPECIFIC代码不起作用 . 你有线索吗?
# PYTHON 3.4
import asyncio
import socket
PORT = 50001
MAX_BYTES = 8400
LOCAL_IP = ''
REMOTE_IP = '192.168.1.31'
serverSock= socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind(('', PORT))
@asyncio.coroutine
def server():
while True:
data, address = serverSock.recvfrom(MAX_BYTES)
print('New data: {}'.format(data.decode('utf8')))
@asyncio.coroutine
def client():
while True:
toSend = input('Enter to send: ')
serverSock.sendto(toSend.encode(),(REMOTE_IP, PORT))
tasks = [server(), client()]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
1 回答
整个协程事件循环原理依赖于一个名为
Cooperative multitasking
的概念 . 这是一个协程的意思是不负责任的,并且决定为自己消耗所有的cpu,没有什么会在这样做时打断它 .你的两个协程都是这样的,它们永远不会自己结束 . 如果您使用多个线程,则在阻塞调用期间将自动进行上下文切换,但在协同程序示例中,您必须明确使用
await
来放弃cpu .