2017-02-19 25 views
1

У меня есть небольшое приложение, в котором одна сопрограмма отправит данные, а другая сопрограмма получит данные и журналы, получал ли они точные переданные данные или нет.Почему 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

ответ

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(). Но что, если я не хочу передавать цикл в качестве параметра в сопрограмму. я не мог понять, почему цикл пришел к картинке, получая данные через сокет. вы можете объяснить мне подробно. Я новичок в этом мире python. @Udi – ringul

+0

Пожалуйста, задайте это как новый вопрос – Udi

+0

@ringul: поскольку цикл является глобальной переменной, вы можете использовать его в любом месте своего кода, не передавая его как paramarter. – Udi