Tôi đang cố gắng để hiểu làm thế nào để làm cho một đối tượng awaitable. Định nghĩa từ các trạng thái documentation:asyncio awaitable object - ví dụ cơ bản
Một đối tượng có phương thức __await__ trả về trình lặp.
Được hướng dẫn bởi định nghĩa mà tôi đã viết đoạn code mẫu:
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())
Dòng mà tôi mong đợi là:
- loop tổ chức sự kiện cung cấp cho kiểm soát để
produce_list()
.produce_list()
từ bỏ thực thi trênnum = await Customer()
. Customer()
được thực hiện và trả về một trình lặp. Mà vì trả về giá trị đầu tiên trong trình lặp. Q1: không rõ ràng tại saonum
không trở thành bản thân trình lặp. Ngoài ra những gì đang làm mộtsend
ở đây?- Khi đã đạt đến giá trị cuối cùng của trình lặp.
num = 4
thực hiện các coroutine tiếp tụcprint(num)
, và in giá trị 4.
gì tôi nhận:
---------------------------------------------------------------------------
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
tôi đã nhận được gì khái niệm sai ở đây?
Cuối cùng, tôi đang tìm một ví dụ sử dụng phép lặp qua danh sách dưới dạng sự kiện để trở về sự kiểm soát của coroutine.
Tôi thực sự đang cố gắng lấy ví dụ rằng cuối cùng không gọi phương thức asyncio lib đã được xác định trước đó. Cuối cùng, bạn đang truyền "await asyncio.sleep" (sleep, result = value) '. Động lực là cố gắng hiểu làm thế nào người ta tiếp cận việc viết một khung công tác asyncio mới. – TheMeaningfulEngineer
Hoặc có thể nói lại nó. Có phải tất cả các coroutine cuối cùng kết thúc lên gọi là 'asyncio.sleep'? – TheMeaningfulEngineer
@TheMeaningfulEngineer 'cách tiếp cận cách viết một khung công tác asyncio mới.' Bạn có nghĩa là một thư viện asyncio như [aiohttp] (http://aiohttp.readthedocs.io/en/stable/) hoặc một giải pháp thay thế asyncio chẳng hạn như [curio] (https://github.com/dabeaz/curio)? Ngoài ra, hãy xem chỉnh sửa của tôi. – Vincent