मैं समझने की कोशिश कर रहा हूं कि एक प्रतीक्षा करने योग्य वस्तु कैसे बनाएं। documentation की परिभाषा बताती है:asyncio प्रतीक्षा करने योग्य वस्तु - मूल उदाहरण
एक ऑब्जेक्टर लौटने वाली __await__ विधि वाला एक ऑब्जेक्ट।
कि परिभाषा मैं नमूना कोड लिखा से प्रेरित होकर:
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())
प्रवाह है कि मैं उम्मीद थी:
- घटना पाश
produce_list()
को नियंत्रण देता है।produce_list()
num = await Customer()
पर निष्पादन देता है। Customer()
निष्पादित किया गया है और एक पुनरावर्तक लौटाता है। जो कि इटरेटर में पहला मान देता है। क्यू 1: यहां स्पष्ट नहीं है कि क्योंnum
इटेटरेटर नहीं बन रहा है। इसके अलावाsend
क्या कर रहा है?- एक बार आखिरी मूल्य इटेटरेटर पहुंच गया है।
num = 4
coroutine के निष्पादनprint(num)
जारी है, और मूल्य 4.
मुझे क्या मिला प्रिंट:
---------------------------------------------------------------------------
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
क्या अवधारणाओं मैं गलत यहाँ मिल गया है?
अंत में मैं एक ऐसा उदाहरण ढूंढ रहा हूं जो कोरआउट के नियंत्रण में लौटने के लिए एक घटना के रूप में एक सूची के माध्यम से पुनरावृत्ति का उपयोग करता है।
मैं वास्तव में एक उदाहरण प्राप्त करने की कोशिश कर रहा हूं कि अंत में पहले परिभाषित एसिन्सियो lib विधि को कॉल नहीं किया जाता है। अंत में आप 'इंतजार कर रहे हैं asyncio.sleep (नींद, परिणाम = मूल्य) '। प्रेरणा यह समझने की कोशिश करना है कि कोई एक नए एसिंसिओ फ्रेमवर्क के लेखन तक कैसे पहुंच जाएगा। – TheMeaningfulEngineer
या शायद इसे फिर से भरना। क्या हर कोरआउट अंततः 'asyncio.sleep' को कॉल करता है? – TheMeaningfulEngineer
@TheMeaningfulEngineer 'एक नए एसिन्सीओ फ्रेमवर्क के लेखन तक कैसे पहुंच जाएगा।' क्या आपका मतलब एसिन्सीओ लाइब्रेरी है जैसे [aiohttp] (http://aiohttp.readthedocs.io/en/stable/) या एसिन्सीओ विकल्प जैसे कि [curio] (https://github.com/dabeaz/curio)? इसके अलावा, मेरा संपादन देखें। – Vincent