Ich versuche zu verstehen, wie man ein zu erwartendes Objekt macht. Die Definition aus documentation besagt:asynciously observable object - grundlegendes Beispiel
Ein Objekt mit einer __await__ -Methode, die einen Iterator zurückgibt.
von dieser Definition Guided ich den Beispielcode geschrieben:
import asyncio
async def produce_list():
num = await Customer()
print(num)
class Customer(object):
def __await__(self):
return iter([1, 2, 3, 4])
loop = asyncio.get_event_loop()
loop.run_until_complete(produce_list())
Die Strömung, die ich erwartet hatte:
- Ereignisschleife gibt die Kontrolle an
produce_list()
.produce_list()
gibt die Ausführung aufnum = await Customer()
auf. Customer()
wird ausgeführt und gibt einen Iterator zurück. Which weil gibt den ersten Wert im Iterator zurück. Q1: bin hier nicht klar, warumnum
nicht der Iterator selbst wird. Auch was macht einsend
hier?- Nach dem letzten Wert wurde der Iterator erreicht.
num = 4
die Ausführung des Koroutine weiterprint(num)
und druckt den Wert 4.
Was ich bekommen habe:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
~/workspace/dashboard/so_question_await.py in <module>()
16
17 loop = asyncio.get_event_loop()
---> 18 loop.run_until_complete(produce_list())
/usr/lib/python3.5/asyncio/base_events.py in run_until_complete(self, future)
464 raise RuntimeError('Event loop stopped before Future completed.')
465
--> 466 return future.result()
467
468 def stop(self):
/usr/lib/python3.5/asyncio/futures.py in result(self)
291 self._tb_logger = None
292 if self._exception is not None:
--> 293 raise self._exception
294 return self._result
295
/usr/lib/python3.5/asyncio/tasks.py in _step(***failed resolving arguments***)
239 result = coro.send(None)
240 else:
--> 241 result = coro.throw(exc)
242 except StopIteration as exc:
243 self.set_result(exc.value)
~/workspace/dashboard/so_question_await.py in produce_list()
5
6 async def produce_list():
----> 7 num = await Customer()
8 print(num)
9
RuntimeError: Task got bad yield: 1
Welche Konzepte habe ich falsch hier bekommen?
Am Ende suche ich nach einem Beispiel, das Iteration durch eine Liste als ein Ereignis verwendet, um zur Steuerung der Coroutine zurückzukehren.
Ich versuche tatsächlich, ein Beispiel zu bekommen, das am Ende nicht eine vorher definierte asyncio lib Methode aufruft. Am Ende gibst du das 'have asyncio.sleep (sleep, result = value)'. Die Motivation besteht darin, zu versuchen, zu verstehen, wie man sich dem Schreiben eines neuen asyncio-Frameworks nähern würde. – TheMeaningfulEngineer
Oder vielleicht um es anders zu formulieren. Hat schließlich jede Coroutine den Namen asyncio.sleep? – TheMeaningfulEngineer
@TheMeaningfulEngineer 'wie würde man das Schreiben eines neuen asyncio-Frameworks angehen? Meinst du eine asyncio-Bibliothek wie [aiohttp] (http://aiohttp.readthedocs.io/en/stable/) oder eine asyncio-Alternative wie [Kuriosität] (https://github.com/dabeaz/curio)? Siehe auch meine Bearbeitung. – Vincent