Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

274
Visualizações
¿El generador asíncrono no es un iterador?

En Python puedes escribir un generador que sea iterable como:

 def generate(count): for x in range(count): yield x # as an iterator you can apply the function next() to get the values. it = generate(10) r0 = next(it) r1 = next(it) ...

Cuando intenta usar un iterador asíncrono, obtiene el error 'rendimiento dentro de asíncrono'. La solución sugerida es implementar su propio generador:

 class async_generator: def __aiter__(self): return self async def __anext__(self): await asyncio.sleep() return random.randint(0, 10) # But when you try to get the next element it = async_generator(10) r0 = next(it)

Obtiene el error "async_generator" object is not an iterator

Creo que si va a llamar a algo un iterador es porque tiene exactamente la misma interfaz, por lo que puedo escribir iteradores asíncronos y usarlos en un marco que depende en gran medida de las llamadas next(). Cualquier nueva capacidad de Python no tiene sentido si necesita reescribir todo su código para poder usar async.

¿Me estoy perdiendo de algo?

¡Gracias!

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Entonces, como dijo @bosnjak, puede usar async para:

 async for ITEM in A_ITER: BLOCK1 else: # optional BLOCK2

Pero si desea iterar manualmente, simplemente puede escribir:

 it = async_iterator() await it.__anext__()

Pero no recomendaría hacer eso.

Creo que si va a llamar a algo iterador es porque tiene exactamente la misma interfaz, por lo que puedo escribir iteradores asíncronos y usarlos en un marco que depende en gran medida de las llamadas next()

No, en realidad no es lo mismo. Hay una diferencia entre los iteradores síncronos regulares y los asíncronos. Y hay algunas razones para eso:

  1. Las corrutinas de Python se construyen sobre generadores internamente
  2. Según Zen of Python, lo explícito es mejor que lo implícito. Para que realmente vea dónde se puede suspender el código.

Es por eso que es imposible usar iter y next con iteradores asincrónicos. Y no puede usarlos con marcos que esperan iteradores sincrónicos. Entonces, si va a hacer que su código sea asíncrono, también debe usar marcos asíncronos. Aquí hay algunos de ellos.

Además, me gustaría decir algunas palabras sobre iteradores y generadores. Iterator es un objeto especial que tiene los métodos __iter__ y __next__ . Mientras que el generador es una función especial que contiene la expresión yield . Todo generador es un iterador, pero no al revés . Lo mismo es aceptable para iteradores y generadores asincrónicos. ¡Sí, desde Python 3.6 puede escribir generadores asíncronos!

 async def ticker(delay, to): for i in range(to): yield i await asyncio.sleep(delay)

Puede leer PEP 525 para más detalles

over 4 years ago · Santiago Trujillo Relatório

0

Creo que se introdujo una nueva declaración para los generadores asíncronos:

 async for TARGET in ITER: BLOCK else: BLOCK2

según PEP 492 .

Básicamente, esto significaría que deberías hacer:

 async for number in generate(10): print(number)

Además, verifique las diferencias de los generadores :

Los objetos de rutina nativos no implementan los métodos iter y next . Por lo tanto, no se pueden iterar ni pasar a iter() , list() , tuple() y otras funciones integradas. Tampoco se pueden usar en un bucle for..in. Un intento de usar iter o next en un objeto de rutina nativo dará como resultado un TypeError .

over 4 years ago · Santiago Trujillo Relatório

0

Usé esto para hacer un bucle asíncrono a través de una lista

 class AsyncRange(object): def __init__(self, length): self.length = length self.i = 0 async def __aiter__(self): return self async def __anext__(self): index = self.i self.i += 1 if self.i <= self.length: return index else: raise StopAsyncIteration

entonces simplemente:

 async for i in AsyncRange(my_list): # your code
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda