2017-02-19 6 views
1

나는 하나의 코 루틴이 데이터를 보내고 다른 코 루틴이 정확한 데이터를 받았는지 여부를 알 수있는 작은 애플리케이션을 가지고있다.python asyncio coroutine이 socket.recv (1024) 라인에서 일시 중지되는 이유는 무엇입니까? 왜 while 루프가 yeild 문장을 넘지 않았습니까?

두 루틴은 while 루프에 있습니다.

hello 
hi 
: 어떤 방법, 횡단() 코 루틴 그들이 여기
data, server = yield from recv_sock.recvfrom(1024) 

XXXXXXX

에서 라인의 수율을 쳤을 때 코 루틴 앞서 진행되지 RECV는()

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) 

출력은 코드입니다

누구나 저에게 알려 주실 수 있습니다. 왜 코 루틴이 명령에서 수확량을 넘지 않았습니까? python을 사용하고 있습니다. 3.3.2

답변

1

yield from 또는 await을 코 루틴과 함께 사용해야합니다. recvfrom은 코 루틴이 아닙니다. 예를 들어, loop.sock_recv() 대신 사용할 수 있습니다

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

을에 recvfrom은 코 루틴이 아닌 경우, 나는 코 루틴으로 소켓을 통해 데이터를 수신 수행하려는 경우 - 귀하의 제안이 loop.sock_recv을 사용하는 것입니다(). 그러나 만약 내가 루프를 매개 변수로 코 루틴에 전달하고 싶지 않으면 어떻게해야할까요? 소켓을 통해 데이터를 수신하는 동안 루프가 그림에 들어온 이유를 이해할 수 없습니다. 너는 나를 자세히 설명해 줄 수 있니? 나는이 파이썬 세상을위한 초보자이다. @Udi – ringul

+0

새로운 질문으로 문의하십시오 – Udi

+0

@ringul : 이후 루프는 전역 변수이므로 매개 변수로 전달하지 않고 코드의 아무 곳에서나 사용할 수 있습니다. – Udi