为什么python asyncio coroutine在socket.recv(1024)行暂停?为什么while循环无法跨越yeild语句?

时间:2017-02-19 17:00:39

标签: asynchronous python-asyncio coroutine

我有一个小应用程序,其中一个协程将发送数据,另一个协同程序将接收数据并记录它是否收到确切的传输数据。

两个协程都在while循环中。一些如何,trans()协程和recv()协程在从XXXXXXX达到线路收益时没有提前进行

data, server = yield from recv_sock.recvfrom(1024)

这是代码

import asyncio
import socket
import time
import datetime
import logging

trans_addr = ('localhost', 5555)
recv_addr = ('localhost',6666)

@asyncio.coroutine
def trans():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(trans_addr)
    i = 0
    global sen_data
    while True:
        print("hi")
        sen_data = "HELLO " + str(i)
        sent = yield from sock.sendto(sen_data.encode(), recv_addr)
        print(sent)
        print("hi1")
        yield from time.sleep(2)
        i += 1
        print("hi1")

@asyncio.coroutine
def recv():
    recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    recv_sock.bind(recv_addr)  # binding the receiving end to 1.241 and port 6666
    #recv_sock.setblocking(0)
    while True:
        try:
            print("hello")
            data, server = yield from recv_sock.recvfrom(1024)
            print("hello2")
            if (data):
                recv_data = data.decode()

                if (sen_data == recv_data):
                    logging.info("transmitted data :" + sen_data + " is Received as :" + recv_data + " at :" + str(
                        datetime.datetime.now()) + '\n')
                    print("transmitted data :" + sen_data + " is Received as :" + recv_data + " at :" + str(
                        datetime.datetime.now()) + " from :" + str(server) + '\n')
                else:
                    logging.critical("Data missed : ")
                    logging.critical("Transmitted data " + sen_data + " is != " + "received data : " + recv_data + '\n')
                    print("data is missing--->")
                    print("Transmitted data " + sen_data + " is != " + "received data : " + recv_data + '\n')
        except:
            pass
            # print("not receiving data due to some fault in the receiving socket")
            # time.sleep(1)

loop=asyncio.get_event_loop()
tasks = [loop.create_task(trans()), loop.create_task(recv())]
wait_tasks = asyncio.wait(tasks)
loop.run_forever()
loop.run_until_complete(wait_tasks)

输出是:

hello
hi

任何人都可以告诉我,为什么协同程序无法跨越命令的收益?我正在使用python 3.3.2

1 个答案:

答案 0 :(得分:1)

yield fromawait应与协同程序一起使用。 recvfrom不是协程。例如,您可以改为使用loop.sock_recv()

reader, writer = socket.socketpair()
writer.setblocking(False)
reader.setblocking(False)
await loop.sock_recv(...)
await loop.sock_sendall(...)