Event Loop

Python SELF VI
Mức độ , Bài học
Có sẵn

6.1 Nhận Event Loop

Event Loop (Event Loop) là thành phần trung tâm trong lập trình bất đồng bộ sử dụng module asyncio trong Python. Nó quản lý việc thực thi các tác vụ bất đồng bộ, xử lý sự kiện và thực hiện các thao tác I/O. Event Loop cho phép nhiều tác vụ chạy đồng thời mà không chặn luồng chính.

Tạo và nhận Event Loop

  • asyncio.get_event_loop(): Trả về Event Loop hiện tại hoặc tạo mới nếu chưa có.
  • asyncio.new_event_loop(): Tạo một Event Loop mới.
  • asyncio.set_event_loop(loop): Thiết lập Event Loop chỉ định làm hiện tại.

Ví dụ:

asyncio có một Event Loop hiện tại chứa tất cả các tác vụ đang thực thi. Bạn có thể nhận Event Loop hiện tại hoặc tạo một cái mới và thiết lập nó làm hiện tại. Điều này được minh họa trong ví dụ dưới đây.


import asyncio

loop = asyncio.get_event_loop()
print(loop)  # Event Loop hiện tại
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
print(asyncio.get_event_loop())  # Event Loop mới được thiết lập

Lưu ý rằng phương thức get_event_loop() trả về Event Loop hoạt động hiện tại. Tạo một Event Loop mới và thiết lập nó nên sử dụng cẩn thận để tránh xung đột trong các ứng dụng bất đồng bộ.

Chạy Event Loop

  • run_forever(): Chạy Event Loop và tiếp tục thực thi cho đến khi gọi stop().
  • run_until_complete(future): Chạy Event Loop và kết thúc sau khi hoàn thành coroutine hoặc đối tượng future được chỉ định.

Ví dụ:

Event Loop có thể chạy theo hai chế độ: chạy vô hạn — tương tự như while True, hoặc cho đến khi hoàn thành một tác vụ cụ thể.


import asyncio

async def hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

Nếu bạn chạy Event Loop trong chế độ run_forever(), nó sẽ xoay vòng bên trong vô tận. Phương thức run_forever() chỉ kết thúc nếu một tác vụ bất đồng bộ nào đó gọi phương thức stop() của Event Loop.

Dừng Event Loop

  • stop(): Dừng Event Loop.
  • is_running(): Trả về True nếu Event Loop đang chạy.

Ví dụ:

Nếu loop chạy trong chế độ vô hạn, nó liên tục nhận các tác vụ và thực hiện chúng, thì tự nó sẽ không dừng lại. Ai đó phải nhận đối tượng loop hiện tại và gọi phương thức stop(). Để biết vòng lặp có chạy mãi mãi hay không, cần gọi phương thức is_running().


import asyncio
            
loop = asyncio.get_event_loop()
loop.stop()
print(loop.is_running())  # False

6.2 Các phương thức quan trọng trong Event Loop

Phương thức call_soon(callback, *args)

Lên kế hoạch gọi hàm callback với các tham số *args càng sớm càng tốt.


import asyncio

def my_callback():
    print("Callback executed")
            
loop = asyncio.get_event_loop()
loop.call_soon(my_callback)
loop.run_forever()

Đặt hàm callback vào đầu danh sách tác vụ để nó bắt đầu thực thi càng sớm càng tốt. Phương thức này hữu ích khi cần thực hiện một tác vụ với độ trễ tối thiểu, đặc biệt khi cần phản hồi ngay lập tức trong ứng dụng bất đồng bộ.

Phương thức call_later(delay, callback, *args)

Lên kế hoạch gọi hàm callback với các tham số *args sau delay giây.


import asyncio

def my_callback():
    print("Callback executed after delay")
            
loop = asyncio.get_event_loop()
loop.call_later(2, my_callback)
loop.run_forever()

Phương thức này cho phép thực hiện một cuộc gọi hàm bị trì hoãn: tham số đầu tiên là độ trễ tính bằng giây (có thể là số thập phân), sau đó là địa chỉ hàm và các tham số của nó. Phương thức này có thể dùng để quản lý thực thi các tác vụ với mức độ khẩn cấp khác nhau, rất hữu ích khi thiết kế các hệ thống bất đồng bộ phức tạp.

Phương thức call_at(when, callback, *args)

Lên kế hoạch gọi hàm callback với các tham số *args tại thời điểm when.


import asyncio
import time
            
def my_callback():
    print("Callback executed at specific time")
            
loop = asyncio.get_event_loop()
when = loop.time() + 2  # Sau 2 giây từ thời gian hiện tại của Event Loop
loop.call_at(when, my_callback)
loop.run_forever()

Nếu bạn muốn chạy một tác vụ không phải sau 5 giây, mà chẳng hạn lúc 15:00 hoặc 24:00, thì bạn sẽ thấy tiện hơn khi sử dụng hàm call_at(), hoạt động tương tự như hàm call_soon(), nhưng tham số đầu tiên là thời gian, không phải độ dài thời gian đợi để gọi hàm. Phương thức này có thể chấp nhận các hàm không bất đồng bộ.

Ưu điểm và đặc điểm

Thực thi bất đồng bộ: Event Loop cho phép thực hiện nhiều tác vụ song song mà không chặn luồng chính.

Quản lý tài nguyên hiệu quả: Các thao tác I/O bất đồng bộ được thực hiện mà không chặn, giúp chương trình hiệu quả hơn.

Lin hoạt và mở rộng: Event Loop hỗ trợ nhiều phương thức để lập kế hoạch tác vụ và xử lý sự kiện, cho phép tạo ra các ứng dụng bất đồng bộ phức tạp và có khả năng mở rộng.

6.3 Tương tác với Tasks và Future objects

Event Loop quản lý thực thi tasks (Tasks) và future objects (Futures). Nó theo dõi trạng thái của chúng và đảm bảo thực thi khi sẵn sàng.

Ví dụ:


import asyncio

async def main():
    await asyncio.sleep(1)
    print("Task completed")
            
loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)

Trong ví dụ này cho thấy cách mà Event Loop quản lý thực thi tác vụ được tạo bằng phương thức create_task. Các phương thức call_soon(), call_later()call_at() có thể sử dụng để quản lý thực thi các tác vụ với mức độ khẩn cấp khác nhau, điều này rất hữu ích khi thiết kế các hệ thống bất đồng bộ phức tạp.

1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Đa luồng
Đa luồng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION