首页 文章

UDP server_client . 在asyncio协同程序中使用Socket对象,没有并发性

提问于
浏览
1

我很难理解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 回答

  • 0

    整个协程事件循环原理依赖于一个名为 Cooperative multitasking 的概念 . 这是一个协程的意思是不负责任的,并且决定为自己消耗所有的cpu,没有什么会在这样做时打断它 .

    你的两个协程都是这样的,它们永远不会自己结束 . 如果您使用多个线程,则在阻塞调用期间将自动进行上下文切换,但在协同程序示例中,您必须明确使用 await 来放弃cpu .

相关问题