Lập trình theo hướng sự kiện
Chương trình hướng sự kiện tập trung vào các sự kiện. Cuối cùng, luồng chương trình phụ thuộc vào các sự kiện. Cho đến nay, chúng ta đang xử lý mô hình thực thi tuần tự hoặc song song nhưng mô hình có khái niệm về lập trình hướng sự kiện được gọi là mô hình không đồng bộ. Lập trình theo hướng sự kiện phụ thuộc vào một vòng lặp sự kiện luôn lắng nghe các sự kiện mới đến. Hoạt động của lập trình hướng sự kiện phụ thuộc vào các sự kiện. Khi một sự kiện lặp lại, thì các sự kiện sẽ quyết định những gì sẽ thực thi và theo thứ tự nào. Sơ đồ sau sẽ giúp bạn hiểu cách hoạt động của nó -
Mô-đun Python - Asyncio
Mô-đun Asyncio đã được thêm vào trong Python 3.4 và nó cung cấp cơ sở hạ tầng để viết mã đồng thời đơn luồng bằng cách sử dụng đồng quy trình. Sau đây là các khái niệm khác nhau được sử dụng bởi mô-đun Asyncio:
Vòng lặp sự kiện
Vòng lặp sự kiện là một chức năng để xử lý tất cả các sự kiện trong một mã tính toán. Nó hoạt động trong suốt quá trình thực hiện toàn bộ chương trình và theo dõi các sự kiện đến và thực hiện. Mô-đun Asyncio cho phép một vòng lặp sự kiện duy nhất cho mỗi quá trình. Tiếp theo là một số phương pháp được cung cấp bởi mô-đun Asyncio để quản lý một vòng lặp sự kiện -
loop = get_event_loop() - Phương thức này sẽ cung cấp vòng lặp sự kiện cho ngữ cảnh hiện tại.
loop.call_later(time_delay,callback,argument) - Phương thức này sắp xếp cuộc gọi lại sẽ được gọi sau giây time_delay đã cho.
loop.call_soon(callback,argument)- Phương thức này sắp xếp cho một cuộc gọi lại sẽ được gọi càng sớm càng tốt. Lệnh gọi lại được gọi sau khi call_soon () trả về và khi điều khiển quay trở lại vòng lặp sự kiện.
loop.time() - Phương thức này dùng để trả về thời gian hiện tại theo đồng hồ bên trong của vòng lặp sự kiện.
asyncio.set_event_loop() - Phương thức này sẽ thiết lập vòng lặp sự kiện cho ngữ cảnh hiện tại thành vòng lặp.
asyncio.new_event_loop() - Phương thức này sẽ tạo và trả về một đối tượng vòng lặp sự kiện mới.
loop.run_forever() - Phương thức này sẽ chạy cho đến khi phương thức stop () được gọi.
Thí dụ
Ví dụ sau về vòng lặp sự kiện giúp in hello worldbằng cách sử dụng phương thức get_event_loop (). Ví dụ này được lấy từ tài liệu chính thức của Python.
import asyncio
def hello_world(loop):
print('Hello World')
loop.stop()
loop = asyncio.get_event_loop()
loop.call_soon(hello_world, loop)
loop.run_forever()
loop.close()
Đầu ra
Hello World
Hợp đồng tương lai
Điều này tương thích với lớp concurrent.futures.Future đại diện cho một tính toán chưa được hoàn thành. Có những khác biệt sau giữa asyncio.futures.Future và concurrent.futures.Future -
Các phương thức result () và exception () không lấy đối số timeout và đưa ra một ngoại lệ khi tương lai chưa được thực hiện.
Các lệnh gọi lại được đăng ký với add_done_callback () luôn được gọi thông qua call_soon () của vòng lặp sự kiện.
Lớp asyncio.futures.Future không tương thích với các hàm wait () và as_completed () trong gói concurrent.futures.
Thí dụ
Sau đây là một ví dụ sẽ giúp bạn hiểu cách sử dụng lớp asyncio.futures.future.
import asyncio
async def Myoperation(future):
await asyncio.sleep(2)
future.set_result('Future Completed')
loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(Myoperation(future))
try:
loop.run_until_complete(future)
print(future.result())
finally:
loop.close()
Đầu ra
Future Completed
Coroutines
Khái niệm về coroutines trong Asyncio tương tự như khái niệm về đối tượng Thread tiêu chuẩn dưới mô-đun luồng. Đây là tổng quát của khái niệm chương trình con. Một chương trình đăng quang có thể bị tạm dừng trong quá trình thực thi để nó chờ xử lý bên ngoài và quay trở lại từ điểm mà nó đã dừng khi xử lý bên ngoài được thực hiện. Hai cách sau đây giúp chúng tôi thực hiện các quy trình:
async def function ()
Đây là một phương pháp để thực hiện các coroutines trong mô-đun Asyncio. Sau đây là một tập lệnh Python cho cùng một:
import asyncio
async def Myoperation():
print("First Coroutine")
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(Myoperation())
finally:
loop.close()
Đầu ra
First Coroutine
@ asyncio.coroutine decorator
Một phương pháp khác để thực hiện các quy trình là sử dụng trình tạo với trình trang trí @ asyncio.coroutine. Sau đây là một tập lệnh Python cho cùng một:
import asyncio
@asyncio.coroutine
def Myoperation():
print("First Coroutine")
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(Myoperation())
finally:
loop.close()
Đầu ra
First Coroutine
Nhiệm vụ
Lớp con của mô-đun Asyncio này chịu trách nhiệm thực thi các quy trình trong vòng lặp sự kiện theo cách song song. Tập lệnh Python sau đây là một ví dụ về xử lý một số tác vụ song song.
import asyncio
import time
async def Task_ex(n):
time.sleep(1)
print("Processing {}".format(n))
async def Generator_task():
for i in range(10):
asyncio.ensure_future(Task_ex(i))
int("Tasks Completed")
asyncio.sleep(2)
loop = asyncio.get_event_loop()
loop.run_until_complete(Generator_task())
loop.close()
Đầu ra
Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9
Phương tiện giao thông
Mô-đun Asyncio cung cấp các lớp truyền tải để thực hiện các kiểu giao tiếp khác nhau. Các lớp này không an toàn theo luồng và luôn được ghép nối với một thể hiện giao thức sau khi thiết lập kênh giao tiếp.
Sau đây là các loại phương tiện di chuyển khác biệt được kế thừa từ BaseTransport:
ReadTransport - Đây là một giao diện cho các phương tiện chỉ đọc.
WriteTransport - Đây là một giao diện cho các phương tiện chỉ ghi.
DatagramTransport - Đây là một giao diện để gửi dữ liệu.
BaseSubprocessTransport - Tương tự với lớp BaseTransport.
Tiếp theo là năm phương thức riêng biệt của lớp BaseTransport mà sau đó là tạm thời trên bốn loại truyền tải -
close() - Nó đóng cửa phương tiện giao thông.
is_closing() - Phương thức này sẽ trả về true nếu quá trình vận chuyển đang đóng hoặc đã bị đóng.
get_extra_info(name, default = none) - Điều này sẽ cung cấp cho chúng tôi một số thông tin bổ sung về vận tải.
get_protocol() - Phương thức này sẽ trả về giao thức hiện tại.
Giao thức
Mô-đun Asyncio cung cấp các lớp cơ sở mà bạn có thể phân lớp để triển khai các giao thức mạng của mình. Các lớp đó được sử dụng cùng với các phương tiện giao thông; giao thức phân tích cú pháp dữ liệu đến và yêu cầu ghi dữ liệu đi, trong khi quá trình truyền tải chịu trách nhiệm về I / O thực và bộ đệm. Sau đây là ba lớp của Giao thức -
Protocol - Đây là lớp cơ sở để triển khai các giao thức phân luồng để sử dụng với các phương tiện truyền tải TCP và SSL.
DatagramProtocol - Đây là lớp cơ sở để thực hiện các giao thức datagram để sử dụng với truyền tải UDP ..
SubprocessProtocol - Đây là lớp cơ sở để thực hiện các giao thức giao tiếp với các tiến trình con thông qua một tập hợp các đường ống một chiều.