Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

273
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!