У меня есть небольшое приложение, в котором одна сопрограмма отправит данные, а другая сопрограмма получит данные и журналы, получал ли они точные переданные данные или нет.Почему python asyncio coroutine останавливается в строке socket.recv (1024)? почему петли while не могут перекреститься с выражениями yeild?
Оба сопроцессора находятся в цикле. Некоторые, как, транс() сопрограммная и 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
Если recvfrom не сопрограмма, то, если я хочу, чтобы выполнить прием данных через сокет как сопрограммы - ваше предложение использовать loop.sock_recv(). Но что, если я не хочу передавать цикл в качестве параметра в сопрограмму. я не мог понять, почему цикл пришел к картинке, получая данные через сокет. вы можете объяснить мне подробно. Я новичок в этом мире python. @Udi – ringul
Пожалуйста, задайте это как новый вопрос – Udi
@ringul: поскольку цикл является глобальной переменной, вы можете использовать его в любом месте своего кода, не передавая его как paramarter. – Udi