2016-10-19 16 views
5

Tôi đã đi qua các tài liệu Python cho asyncio và tôi tự hỏi tại sao hầu hết các ví dụ sử dụng loop.run_until_complete() như trái ngược với Asyncio.ensure_future().Tại sao hầu hết các ví dụ asyncio sử dụng loop.run_until_complete()?

Ví dụ: https://docs.python.org/dev/library/asyncio-task.html

Dường ensure_future sẽ là một cách tốt hơn để chứng minh những ưu điểm của chức năng non-blocking. Mặt khác, run_until_complete sẽ chặn vòng lặp giống như chức năng đồng bộ.

Điều này làm cho tôi cảm thấy mình nên sử dụng run_until_complete thay vì kết hợp ensure_future với loop.run_forever() để chạy đồng thời nhiều đồng thời.

+2

'run_until_complete' không chặn bất kỳ thứ gì. Sự khác biệt giữa nó và 'run_forever' là vòng lặp tạm dừng khi hoàn thành coroutine. Thời gian duy nhất nó sẽ chặn là nếu coroutine của bạn không bao giờ chờ đợi. – dirn

+1

Tôi đã viết http://pastebin.com/Qi8dQ3bh này và nó dường như chặn các vòng lặp mặc dù. 'do_other_things()' không thực hiện cho đến khi 'do_io()' được thực hiện, mặc dù 'do_io()' đang chờ một giấc ngủ. – SamuelN

+2

Đó là bởi vì không có gì khác đã được lên lịch với vòng lặp. Hãy thử gọi 'loop.create_task (do_other_things())' trước khi bạn gọi 'run_forever'. – dirn

Trả lời

5

run_until_complete được sử dụng để chạy trong tương lai cho đến khi hoàn tất. Nó sẽ chặn việc thực thi mã theo sau nó. Nó làm, tuy nhiên, gây ra vòng lặp sự kiện để chạy. Bất kỳ tương lai nào đã được lên lịch sẽ chạy cho đến khi tương lai được chuyển đến run_until_complete được thực hiện.

Với ví dụ này:

import asyncio 

async def do_io(): 
    print('io start') 
    await asyncio.sleep(5) 
    print('io end') 

async def do_other_things(): 
    print('doing other thigns') 

loop = asyncio.get_event_loop() 

loop.run_until_complete(do_io()) 
loop.run_until_complete(do_other_things()) 

loop.close() 

do_io sẽ chạy. Sau khi hoàn tất, do_other_things sẽ chạy. đầu ra của bạn sẽ

io start 
io end 
doing other thigns 

Nếu bạn lên lịch do_other_things với vòng lặp sự kiện trước khi chạy do_io, kiểm soát sẽ chuyển do_io-do_other_things khi đang chờ đợi cựu.

loop.create_task(do_other_things()) 
loop.run_until_complete(do_io()) 

Điều này sẽ giúp bạn có được đầu ra của

Điều này là do do_other_things được lên kế hoạch trước khi do_io. Có rất nhiều cách khác nhau để có được kết quả đầu ra là

doing other thigns 
io start 
io end 

nhưng cái nào có ý nghĩa thực sự phụ thuộc vào ứng dụng của bạn thực sự làm gì. Vì vậy, tôi sẽ để nó như một bài tập cho người đọc.

Các vấn đề liên quan