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