2016-07-07 7 views
0

asyncioモジュールに欠けている、私はBaseEventLoop.sock_recv()が実装されているとまったく同じ方法でそれを再実装しようとしました:asyncioでrecvmsg()を実装する方法は? <code>recvmsg()</code>以来

import asyncio, socket 


def _sock_recvmsg(loop, fut, registered, sock, bufsize, ancbufsize): 
    self = loop 
    fd = sock.fileno() 
    if registered: self.remove_reader(fd) 
    if fut.cancelled(): return 
    try: data = sock.recvmsg(bufsize, ancbufsize) 
    except (BlockingIOError, InterruptedError): self.add_reader(fd, self._sock_recvmsg, fut, True, sock, bufsize, ancbufsize) 
    except Exception as exc: fut.set_exception(exc) 
    else: fut.set_result(data) 


def sock_recvmsg(loop, sock, bufsize, ancbufsize=0): 
    self = loop 
    if self._debug and sock.gettimeout() != 0: raise ValueError('the socket must be non-blocking') 
    fut = asyncio.futures.Future(loop=self) 
    self._sock_recvmsg(fut, False, sock, bufsize, ancbufsize) 
    return fut 


asyncio.unix_events._UnixSelectorEventLoop._sock_recvmsg = _sock_recvmsg 
asyncio.unix_events._UnixSelectorEventLoop.sock_recvmsg = sock_recvmsg 

しかし、この些細なテストが失敗した場合、最初の値のみを受信し、テストをした後ハングアップされますそれ:

async def produce(): 
    for i in range(5): 
     end_out.sendmsg([bytes([i])]) 
     await asyncio.sleep(1) 

    end_out.close() 

async def consume(): 
    while True: 
     v, a, b, c = await asyncio.get_event_loop().sock_recvmsg(end_in, 1) 
     if v == b'': return 
     print(v) 

if __name__ == '__main__': 
    end_in, end_out = socket.socketpair() 
    asyncio.ensure_future(produce()) 
    asyncio.get_event_loop().run_until_complete(consume()) 

私は何が欠けていますか?

答えて

0

recvmsg()関連のコードは正しいですが、私はその質問の削除を検討しているように、愚かである

end_in.setblocking(0) 
end_out.setblocking(0) 

を見逃しています。

関連する問題